WA 0分求调
查看原帖
WA 0分求调
1071426
shx2011楼主2025/1/22 19:33
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],tree[4*N],add[4*N],mul[4*N];//add:加法的标记; mul:的标记
int n,q,m;
void build(int l,int r,int k){
    if(l==r){
        tree[k]=a[l];
        return;
    }

    int mid=l+r>>1;
    build(l,mid,2*k);
    build(mid+1,r,2*k+1);
    tree[k]=(tree[k*2]+tree[k*2+1])%m;
}

void Achange(int l,int r,int k,int v){
    tree[k]+=v*(r-l+1)%m;
    add[k]+=v%m;
}

void Adown(int l,int r,int k){
    if(add[k]!=0){
        int mid=l+r>>1;
        Achange(l,mid,2*k,add[k]);
        Achange(mid+1,r,2*k+1,add[k]);
        add[k]=0;
    }
}

void Mchange(int l,int r,int k,int v){
    tree[k]=tree[k]*v%m;
    mul[k]=mul[k]*v%m;
    add[k]=add[k]*v%m;

}

void Mdown(int l,int r,int k){
    if(mul[k]!=0){
        int mid=l+r>>1;
        Mchange(l,mid,2*k,add[k]);
        Mchange(mid+1,r,2*k+1,add[k]);
        mul[k]=0;
    }
}

void Aupdate(int l,int r,int k,int x,int y,int v){
    if(x<=l && y>=r){
        Achange(l,r,k,v);
        return;
    }

    int mid=l+r>>1;
    Adown(l,r,k);
    if(x<=mid) Aupdate(l,mid,2*k,x,y,v);
    if(y>mid) Aupdate(mid+1,r,2*k+1,x,y,v);
    tree[k]=(tree[2*k]+tree[2*k+1])%m;
}

void Mupdate(int l,int r,int k,int x,int y,int v){
    if(x<=l && y>=r){
        Mchange(l,r,k,v);//到达目标节点后修改值
        return;

    }
    int mid=l+r>>1;
    Mdown(l,r,k); 
    if(x<=mid) Mupdate(l,mid,2*k,x,y,v);
    if(y>mid) Mupdate(mid+1,r,2*k+1,x,y,v);
    tree[k]=(tree[2*k]+tree[2*k+1])%m;
}

int Aquery(int l,int r,int k,int x,int y){
    if(x<=l && y>=r){
        return tree[k];
    }

    int mid=l+r>>1;
    Adown(l,r,k);
    int res=0;
    if(x<=mid) res=(res+Aquery(l,mid,2*k,x,y))%m;
    if(y>mid) res=(res+Aquery(mid+1,r,2*k+1,x,y))%m;
    return res%m;
}

int Mquery(int l,int r,int k,int x,int y){
    if(x<=l && y>=r){
        return tree[k];
    }

    int mid=l+r>>1;
    Mdown(l,r,k);
    int res=0;
    if(x<=mid) res=(res+Mquery(l,mid,2*k,x,y))%m;
    if(y>mid) res=(res+Mquery(mid+1,r,2*k+1,x,y))%m;
    return res%m;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
    cin>>n>>q>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    for(int i=1;i<=n;i++) mul[i]=1;
    while(q--){
        int p;
        int x,y,k;
        cin>>p;
        if(p==1){
            cin>>x>>y>>k;
           	Mupdate(1,n,1,x,y,k);
        }else if(p==2){
            cin>>x>>y>>k;
            Aupdate(1,n,1,x,y,k);
        }else if(p==3){
            cin>>x>>y;
            cout<<(Aquery(1,n,1,x,y)+Mquery(1,n,1,x,y))%m<<endl;
        }
    }
    return 0;
}

2025/1/22 19:33
加载中...