其他分享
首页 > 其他分享> > Luogu P3373 【模板】线段树 2

Luogu P3373 【模板】线段树 2

作者:互联网

#include<cstdio>
#include<cstring>
#include<algorithm>
#define R register
#define llt long long int
#define N 100000
using namespace std;
inline void read(llt& x){
    char temp=getchar();bool u=0;
    for(x=0;temp<'0'||temp>'9';u=temp=='-',temp=getchar());
    for(;temp>='0'&&temp<='9';x=x*10+temp-'0',temp=getchar());
    if(u)x=-x;
    return ;
}
llt n,m,p;
llt A[N];
llt val[N<<2];
llt add[N<<2];
llt mul[N<<2];
inline llt add_(R llt x,R llt y){
    return (x+y)%p;
}
inline llt mul_(R llt x,R llt y){
    return (x*y)%p;
}
void init(llt k=1,llt l=1,llt r=n){
    add[k]=0;
    mul[k]=1;
    if(l==r){
        val[k]=A[l]%p;
        return ;
    }
    R llt mid=(l+r)>>1;
    init(k<<1,l,mid);
    init(k<<1|1,mid+1,r);
    val[k]=add_(val[k<<1],val[k<<1|1]);
    return ;
}
void pushdown(llt &k,llt &l,llt &r,llt &mid){
    R llt ls=k<<1,rs=k<<1|1;
    val[ls]=mul_(val[ls],mul[k]);
    val[rs]=mul_(val[rs],mul[k]);
    val[ls]=add_(val[ls],add[k]*(mid-l+1));
    val[rs]=add_(val[rs],add[k]*(r-mid));
    mul[ls]=mul_(mul[ls],mul[k]);
    mul[rs]=mul_(mul[rs],mul[k]);
    add[ls]=mul_(add[ls],mul[k]);
    add[rs]=mul_(add[rs],mul[k]);
    add[ls]=add_(add[ls],add[k]);
    add[rs]=add_(add[rs],add[k]);
    add[k]=0;
    mul[k]=1;
    return ;
}
void ch1(llt &x,llt &y,llt &v,llt k=1,llt l=1,llt r=n){
    if(l>=x&&y>=r){
        mul[k]=mul_(mul[k],v);
        add[k]=mul_(add[k],v);
        val[k]=mul_(val[k],v);
        return ;
    }
    R llt mid=(l+r)>>1;
    pushdown(k,l,r,mid);
    if(x<=mid)ch1(x,y,v,k<<1,l,mid);
    if(mid<y)ch1(x,y,v,k<<1|1,mid+1,r);
    val[k]=add_(val[k<<1],val[k<<1|1]);
    return ;
}
void ch2(llt &x,llt &y,llt &v,llt k=1,llt l=1,llt r=n){
    if(l>=x&&y>=r){
        add[k]=add_(add[k],v);
        val[k]=add_(val[k],mul_(v,r-l+1));
        return ;
    }
    R llt mid=(l+r)>>1;
    pushdown(k,l,r,mid);
    if(x<=mid)ch2(x,y,v,k<<1,l,mid);
    if(mid<y)ch2(x,y,v,k<<1|1,mid+1,r);
    val[k]=add_(val[k<<1],val[k<<1|1]);
    return ;
}
llt get(llt &x,llt &y,llt k=1,llt l=1,llt r=n){
    if(l>=x&&y>=r)return val[k];
    R llt mid=(l+r)>>1;
    R llt res=0;
    pushdown(k,l,r,mid);
    if(x<=mid)res=add_(res,get(x,y,k<<1,l,mid));
    if(mid<y)res=add_(res,get(x,y,k<<1|1,mid+1,r));
    return res%p;
}
int main(){
    R llt i,tmp,x,y;
    read(n);
    read(m);
    read(p);
    for(i=1;i<=n;i++)
        read(A[i]);
    init();
    for(i=1;i<=m;i++){
        read(tmp);
        read(x);
        read(y);
        switch(tmp){
            case 1:{
                read(tmp);
                ch1(x,y,tmp);
                break;
            }
            case 2:{
                read(tmp);
                ch2(x,y,tmp);
                break;
            }
            case 3:{
                printf("%lld\n",get(x,y));
                break;
            }
        }
    }
    return 0;
}

  

标签:val,temp,Luogu,mid,llt,add,mul,P3373,模板
来源: https://www.cnblogs.com/TbIblog/p/11208343.html