rt,悬关
代码:
#include <bits/stdc++.h>
using namespace std;
int x,y,z;
struct node{
int n,l,r,s;
int ad;
int ch;
};
node tre[4000005];
int m[1000005];
void js(long long q,long long l,long long r){
tre[q].ad=0;
tre[q].ch=1;
tre[q].l=l;
tre[q].r=r;
tre[q].s=m[l];
if(l==r){
return ;
}
long long mid=(l+r)/2;
js(q*2,l,mid);
js(q*2+1,mid+1,r);
tre[q].s=tre[q*2].s+tre[q*2+1].s;
}
/*
1 2 3 4 5 --- 15
*2
2 4 6 8 10 --- 30
*/
void cfd(int q){
if(tre[q].ch!=1){
tre[q*2].s*=tre[q].ch;
tre[q*2+1].s*=tre[q].ch;
tre[q*2].ch+=tre[q].ch;
tre[q*2+1].ch+=tre[q].ch;
tre[q].ch=1;
tre[q*2].s%=z;
tre[q*2+1].s%=z;
}
return ;
}
void jfd(int q){
if(tre[q].ad!=0){
tre[q*2].s+=tre[q].ad*(tre[q*2].r-tre[q*2].l+1),
tre[q*2+1].s+=tre[q].ad*(tre[q*2+1].r-tre[q*2+1].l+1);
tre[q*2].ad+=tre[q].ad;
tre[q*2+1].ad+=tre[q].ad;
tre[q].ad=0;
tre[q*2].s%=z;
tre[q*2+1].s%=z;
}
return ;
}
void qjcf(int q,int ml,int mr,int u){
if(tre[q].r<ml) return ;
if(tre[q].l>mr) return ;
if(tre[q].l>=ml&&tre[q].r<=mr){
tre[q].s*=u;
tre[q].s%=z;
tre[q].ch+=u;
return ;
}
cfd(q);
jfd(q);
if(tre[q].l<=ml) qjcf(q*2,ml,mr,u);
if(tre[q].r>=mr) qjcf(q*2+1,ml,mr,u);
tre[q].s=tre[q*2].s+tre[q*2+1].s;
}
void qjjf(int q,int ml,int mr,int u){
if(tre[q].r<ml) return ;
if(tre[q].l>mr) return ;
//cout<<tre[q].l<<" "<<tre[q].r<<endl;
if(tre[q].l>=ml&&tre[q].r<=mr){
tre[q].s+=(tre[q].r-tre[q].l+1)*u;
tre[q].s%=z;
tre[q].ad+=u;
return ;
}
cfd(q);
jfd(q);
long long mid=tre[q].l+tre[q].r>>1;
if(ml<=mid) qjjf(q*2,ml,mr,u);
if(mr>mid) qjjf(q*2+1,ml,mr,u);
tre[q].s=tre[q*2].s+tre[q*2+1].s;
}
long long qjqh(int q,int ml,int mr){
if(tre[q].r<ml) return 0;
if(tre[q].l>mr) return 0;
//cout<<tre[q].l<<" "<<tre[q].r<<endl;
cfd(q);
jfd(q);
//tre[q].s=tre[q*2].s+tre[q*2+1].s;
if(tre[q].l>=ml&&tre[q].r<=mr){
return tre[q].s;
}
long long mid=(tre[q].l+tre[q].r)/2;
int sum=0;
if(ml<=mid) sum+=qjqh(q*2,ml,mr);
if(mr>mid) sum+=qjqh(q*2+1,ml,mr);
return sum;
}
int main(){
cin>>x>>y>>z;
for(int i=1;i<=x;i++){
cin>>m[i];
}
js(1,1,x);
for(int i=1;i<=y;i++){
int a,b,c,d;
cin>>a;
if(a==1){
cin>>b>>c>>d;
qjcf(1,b,c,d);
//for(int i=1;i<=x*4;i++){
// cout<<" "<<tre[i].s<<" "<<tre[i].l<<" "<<tre[i].r<<endl;
//}
}
if(a==2){
cin>>b>>c>>d;
qjjf(1,b,c,d);
//for(int i=1;i<=x*4;i++){
// cout<<" "<<tre[i].s<<" "<<tre[i].l<<" "<<tre[i].r<<endl;
//}
}
if(a==3){
cin>>b>>c;
cout<<qjqh(1,b,c)%z<<endl;
//for(int i=1;i<=x*4;i++){
// cout<<" "<<tre[i].s<<" "<<tre[i].l<<" "<<tre[i].r<<endl;
// }
}
}
}
0pts