flag1乘flag2加
#include<iostream>
using namespace std;
struct node{
long long fa,l,r,sum,flag1,flag2;
}tree[400005];
long long n,q,m,op,a[100005];
void build(long long fa,long long l,long long r){
tree[fa].l=l;tree[fa].r=r;tree[fa].flag1=1;
if(l==r) {
tree[fa].sum=a[l]%m;
return;
}
long long mid=(l+r)/2;
build(fa*2,l,mid);
build(fa*2+1,mid+1,r);
tree[fa].sum=(tree[fa*2].sum+tree[fa*2+1].sum)%m;
return;
}
void down(long long fa){
tree[fa*2].sum=tree[fa*2].sum*tree[fa].flag1+tree[fa].flag2*(tree[fa*2].r-tree[fa*2].l+1);
tree[fa*2+1].sum=tree[fa*2+1].sum*tree[fa].flag1+tree[fa].flag2*(tree[fa*2+1].r-tree[fa*2+1].l+1);
tree[fa*2].flag1*=tree[fa].flag1;
tree[fa*2].flag2=tree[fa*2].flag2*tree[fa].flag1+tree[fa].flag2;
tree[fa*2+1].flag1*=tree[fa].flag1;
tree[fa*2+1].flag2=tree[fa*2+1].flag2*tree[fa].flag1+tree[fa].flag2;
tree[fa].flag1=1;tree[fa].flag2=0;
tree[fa*2].sum%=m;tree[fa*2+1].sum%=m;
tree[fa*2].flag1%=m;tree[fa*2+1].flag1%=m;
return;
}
void add1(long long fa,long long l,long long r,long long k){
if(tree[fa].l>=l&&tree[fa].r<=r){
tree[fa].flag1=(tree[fa].flag1*k)%m;
tree[fa].flag2*=k;
tree[fa].sum=(tree[fa].sum*k)%m;
return;
}
if(tree[fa].flag1!=1||tree[fa].flag2!=0) down(fa);
long long mid=(tree[fa].r+tree[fa].l)/2;
if(mid>=l) add1(fa*2,l,r,k);
if(mid<r) add1(fa*2+1,l,r,k);
tree[fa].sum=tree[fa*2].sum+tree[fa*2+1].sum;
tree[fa].sum%=m;
return;
}
void add2(long long fa,long long l,long long r,long long k){
if(tree[fa].l>=l&&tree[fa].r<=r){
tree[fa].flag2+=k;
tree[fa].sum+=(tree[fa].r-tree[fa].l+1)*k;
tree[fa].sum%=m;
return;
}
if(tree[fa].flag1!=1||tree[fa].flag2!=0) down(fa);
long long mid=(tree[fa].r+tree[fa].l)/2;
if(mid>=l) add2(fa*2,l,r,k);
if(mid<r) add2(fa*2+1,l,r,k);
tree[fa].sum=tree[fa*2].sum+tree[fa*2+1].sum;
tree[fa].sum%=m;
return;
}
long long ask(long long fa,long long l,long long r){
if(tree[fa].l>=l&&tree[fa].r<=r) return tree[fa].sum;
if(tree[fa].flag1!=1||tree[fa].flag2!=0) down(fa);
long long mid=(tree[fa].r+tree[fa].l)/2;
long long ans=0;
if(mid>=l) ans+=ask(fa*2,l,r);
if(mid<r) ans+=ask(fa*2+1,l,r);
ans=ans%m;
return ans;
}
int main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for (int i=1;i<=q;i++){
cin>>op;
long long l,r,k;
if(op==1){
cin>>l>>r>>k;
add1(1,l,r,k);
}
else if(op==2){
cin>>l>>r>>k;
add2(1,l,r,k);
}
else {
cin>>l>>r;
cout<<ask(1,l,r)<<endl;
}
}
return 0;
}