rt,调了几个小时,救救蒟蒻吧
#include<bits/stdc++.h>
using namespace std;
struct node {
long long ll,rr,v,lazy,_lazy;
} t[1400060];
long long h[100060];
long long s;
void build(long long id,long long l,long long r) {
t[id].ll=l;
t[id].rr=r;
t[id]._lazy=1;
t[id].lazy=0;
if(l==r) {
t[id].v=h[l]%s;
return;
}
long long mid=(l+r)/2;
build(2*id,l,mid);
build(2*id+1,mid+1,r);
t[id].v=(t[2*id].v+t[2*id+1].v)%s;
}
void pushdown(long long id) {
//cout<<"-----------"<<t[id].lazy+t[id]._lazy<<' '<<id<<endl;
//cout<<id<<" ::: "<<t[id].lazy<<" rrrrr "<<t[id]._lazy<<endl;//if(id==2)&&t[id].v==60
if(t[id].lazy!=0||t[id]._lazy!=0) {
long long a=t[id].lazy,b=t[id]._lazy,c=2*id,d=2*id+1;
t[c].v=(b*t[c].v)%s+a*(t[c].rr-t[c].ll+1);
t[c].v%=s;
t[d].v=(b*t[d].v)%s+a*(t[d].rr-t[d].ll+1);
t[d].v%=s;
t[c]._lazy=(t[c]._lazy*b)%s;
t[d]._lazy=(t[d]._lazy*b)%s;
t[c].lazy=((t[c].lazy*b)%s+a)%s;
t[d].lazy=((t[d].lazy*b)%s+a)%s;
t[id].lazy=0;t[id]._lazy=1;
}
}
void change(long long x,long long y,long long k,long long l,long long r,long long id) {
//if(k==3&&id==4)
//cout<<"ikkkkkkkkkkkkkkkk "<<id<<" ::: "<<t[id].v<<endl;
if(x<=l&&y>=r) {
t[id].v+=k*(r-l+1);
t[id].v%=s;
//if(k==6&&id==2)cout<<"ikkkkkkkk "<<t[id].v<<endl;
t[id].lazy+=k;
t[id].lazy%=s;
return;
}
pushdown(id);
long long mid=(l+r)/2;
if(x<=mid)change(x,y,k,l,mid,id*2);
if(y>mid)change(x,y,k,mid+1,r,id*2+1);
t[id].v=(t[id*2].v+t[id*2+1].v)%s;
}
void _change(long long x,long long y,long long k,long long l,long long r,long long id) {
//if(k==2)
// cout<<id<<" :::: "<<t[id].v<<" kkkkkkkkk"<<endl;
if(x<=l&&y>=r) {
t[id].v*=k;
t[id].v%=s;//
t[id]._lazy*=k;
t[id]._lazy%=s;
t[id].lazy*=k;
t[id].lazy%=s;
return;
}
pushdown(id);
long long mid=(l+r)/2;
if(x<=mid)_change(x,y,k,l,mid,id*2);
if(y>mid)_change(x,y,k,mid+1,r,id*2+1);
t[id].v=(t[id*2].v+t[id*2+1].v)%s;
}
long long search(long long x,long long y,long long l,long long r,long long id) {
//cout<<id<<endl;
if(x<=l&&y>=r) {
return t[id].v;
}
pushdown(id);
long long mid=(l+r)/2,p=0,q=0;
if(x<=mid)p=search(x,y,l,mid,id*2)%s;
if(y>mid)q=search(x,y,mid+1,r,id*2+1)%s;
return p+q;
}
int main() {
//freopen("xx.in","r",stdin);
long long n,m,x,y,k;
cin>>n>>m>>s;
for(long long i=1; i<=n; i++)cin>>h[i];
build(1,1,n);
//建树for(int i=1;i<=100;i++)cout<<t[i].ll<<'-'<<t[i].rr<<'='<<t[i].v<<endl;
while(m--) {
int op;
cin>>op;
if(op==1) {
cin>>x>>y>>k;
_change(x,y,k,1,n,1);
} else {
if(op==2) {
cin>>x>>y>>k;
change(x,y,k,1,n,1);
} else {
cin>>x>>y;
cout<<search(x,y,1,n,1)%s<<endl;
}
}
//cout<<"ttt"<<t[1].v<<endl;
//change
//if(m==1)
//for(int i=1; i<=11; i++)cout<<t[i].ll<<'-'<<t[i].rr<<'='<<t[i].v<<endl;
//cout<<"-----------------------------"<<endl;
}
return 0;
}