#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define read(x) cin>>x
template<typename T>inline void read(T &x){
x=0;int f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
x*=f;
}
int n,q,m,a,b,c,d;ll s[(int)4e5];
struct tree{
int l,r;ll va,tag1,tag2;
} t[(int)4e5+5];
void buildt(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].va=s[l]%m;return;
}
int mid=(l+r)>>1;
buildt(p*2,l,mid);
buildt(p*2+1,mid+1,r);
t[p].va=(t[p*2].va+t[p*2+1].va)%m;
}
void spread(int p){
ll tmp;
if(t[p].tag1){
tmp=t[p].tag1;
t[p*2].va=(t[p*2].va+tmp*(t[p*2].r-t[p*2].l+1))%m;
t[p*2+1].va=(t[p*2+1].va+tmp*(t[p*2+1].r-t[p*2+1].l+1))%m;
t[p*2].tag1=(t[p*2].tag1+tmp)%m;t[p*2+1].tag1=(t[p*2+1].tag1+tmp)%m;
t[p].tag1=0;
}
if(t[p].tag2){
tmp=t[p].tag2;
t[p*2].va=(t[p*2].va*tmp)%m;
t[p*2+1].va=(t[p*2+1].va*tmp)%m;
t[p*2].tag2=(t[p*2].tag2*tmp)%m;t[p*2+1].tag2=(t[p*2+1].tag2*tmp)%m;
t[p].tag2=0;
}
}
void upd1(int p,int l,int r,int k){
if(t[p].l>=l&&t[p].r<=r){
t[p].va=(t[p].va+(ll)k*(t[p].r-t[p].l+1))%m;
t[p].tag1=(t[p].tag1+k)%m;
return;
}
spread(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) upd1(p*2,l,r,k);
if(r>mid) upd1(p*2+1,l,r,k);
t[p].va=(t[p*2].va+t[p*2+1].va)%m;
}
void upd2(int p,int l,int r,int k){//bug
if(t[p].l>=l&&t[p].r<=r){
t[p].va=(t[p].va*k)%m;
t[p].tag2=(t[p].tag2*k)%m;
return;
}
spread(p);
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) upd2(p*2,l,r,k);
if(r>mid) upd2(p*2+1,l,r,k);
t[p].va=(t[p*2].va+t[p*2+1].va)%m;
}
ll query(int p,int l,int r){
if(l<=t[p].l&&r>=t[p].r){/*cout<<t[p].l<<t[p].r<<' ';*/return t[p].va;}
spread(p);
int mid=(t[p].l+t[p].r)>>1;ll ans=0;
if(l<=mid) ans+=query(p*2,l,r);
if(r>mid) ans+=query(p*2+1,l,r);
return ans;
}
int main(){
read(n);read(q);read(m);
for(int i=1;i<=n;++i) read(s[i]);
buildt(1,1,n);
for(int i=0;i<q;++i){
read(a);
if(a==1){
read(b);read(c);read(d);
upd2(1,b,c,d);
}
else if(a==2){
read(b);read(c);read(d);
upd1(1,b,c,d);
}
else if(a==3){
read(b);read(c);
cout<<query(1,b,c)%m<<endl;
}
//if(i==1) for(int i=1;i<=4*n;++i) if(t[i].va!=0) cout<<t[i].va<<' '<<t[i].l<<' '<<t[i].r<<endl;
/*for(int i=1;i<=n;++i){
cout<<query(1,i,i)<<' ';
}cout<<endl;*/
}
return 0;
}
样例是通过的,但交上去爆零。
orz求助巨佬!