RT求调
大佬救我!!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int mod;
int a[N];
struct fyn{
int b[N<<1],l[N<<1],r[N<<1];
int tag[N<<1],time[N<<1];
int cnt;
inline int newnode(){++cnt;b[cnt]=0;l[cnt]=r[cnt]=0;tag[cnt]=0;time[cnt]=1;return cnt;}
inline void build(int nl,int nr,int now){
if(nl==nr){
b[now]=a[nl];
return;
}
int mid((nr-nl>>1)+nl);
build(nl,mid,l[now]=newnode());
build(mid+1,nr,r[now]=newnode());
b[now]=b[l[now]]+b[r[now]];
return;
}
inline void pushdown(int nl,int nr,int now){
int mid=((nr-nl>>1)+nl);
b[l[now]]*=time[now];
b[l[now]]%=mod;
b[r[now]]*=time[now];
b[r[now]]%=mod;
time[l[now]]*=time[now];
time[l[now]]%=mod;
time[r[now]]*=time[now];
time[r[now]]%=mod;
time[now]=1;
b[l[now]]+=tag[now]*(mid-nl+1);
b[l[now]]%=mod;
b[r[now]]+=tag[now]*(nr-mid);
b[r[now]]%=mod;
tag[l[now]]+=tag[now];
tag[l[now]]%=mod;
tag[r[now]]+=tag[now];
tag[r[now]]%=mod;
tag[now]=0;
return;
}
inline void pushup(int now){
b[now]=b[l[now]]+b[r[now]];
b[now]%=mod;
}
inline void add(int wl,int wr,int nl,int nr,int now,int c){
if(wl<=nl && nr<=wr){
b[now]+=c*(nr-nl+1);
tag[now]+=c;
b[now]%=mod;
return;
}
pushdown(nl,nr,now);
int mid((nr-nl>>1)+nl);
if(wl<=mid)add(wl,wr,nl,mid,l[now],c);
if(mid<wr)add(wl,wr,mid+1,nr,r[now],c);
pushup(now);
return;
}
inline void adtime(int wl,int wr,int nl,int nr,int now,int c){
if(wl<=nl&&nr<=wr){
pushdown(nl,nr,now);
b[now]*=c;
b[now]%=mod;
time[now]*=c;
time[now]%=mod;
return;
}
pushdown(nl,nr,now);
int mid((nr-nl>>1)+nl);
if(wl<=mid)adtime(wl,wr,nl,mid,l[now],c);
if(mid<wr)adtime(wl,wr,mid+1,nr,r[now],c);
pushup(now);
return;
}
inline int query(int wl,int wr,int nl,int nr,int now){
if(wl<=nl && nr<=wr){
pushdown(nl,nr,now);
return b[now]%mod;
}
pushdown(nl,nr,now);
int mid((nr-nl>>1)+nl);
int ans=0;
if(wl<=mid)ans+=query(wl,wr,nl,mid,l[now])%mod,ans%=mod;
if(mid<wr)ans+=query(wl,wr,mid+1,nr,r[now])%mod,ans%=mod;
return ans%mod;
}
inline void print(int nl,int nr,int now){
cout<<nl<<' '<<nr<<' '<<b[now]<<' '<<tag[now]<<endl;
if(nl==nr)return;
int mid((nr-nl>>1)+nl);
print(nl,mid,l[now]);
print(mid+1,nr,r[now]);
}
}glove;
int n,m;
int rt;
signed main(){
cin>>n>>m>>mod;
for(int i=1;i<=n;++i){
cin>>a[i];
a[i]%=mod;
}
glove.build(1,n,rt=glove.newnode());
for(int i=1;i<=n;++i){
int op,x,y,c;
cin>>op>>x>>y;
if(op==3){
cout<<glove.query(x,y,1,n,rt)%(mod)<<endl;
}else{
cin>>c;
if(op==2)
glove.add(x,y,1,n,rt,c);
else
glove.adtime(x,y,1,n,rt,c);
}
// cout<<endl<<"____"<<endl;
// glove.print(1,n,1);
// cout<<"----"<<endl;
}
return(0-0);
}