觉得写得没什么问题,可是过不了样例。
码风良好。
#include <bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned long long
#define inf 2147483647
#define eps 1e-9
#define endl "\n"
#define il inline
using namespace std;
const int N=1e5+5,M=5e5+5;
inline int read(){
int x(0),f(1);char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}
while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int n,m,a[N],t,mod;
struct segment_tree{
#define root 1,1,n
#define ls (pos<<1)
#define rs (ls|1)
#define mid ((l+r)>>1)
#define l_son ls,l,mid
#define r_son rs,mid+1,r
#define This pos,l,r
int data[N<<2],tag[N<<2],tag2[N<<2];
void upd(int pos){
data[pos]=data[ls]+data[rs];
data[pos]%=mod;
return ;
}
void build(int pos,int l,int r){
tag2[pos]=1;
if(l==r){
data[pos]=a[l];
data[pos]%=mod;
return;
}
build(l_son),build(r_son),upd(pos);
return ;
}
void stg(int pos,int l,int r,int v){
data[pos]+=v*(r-l+1);
data[pos]%=mod;
tag[pos]+=v;
tag[pos]%=mod;
return ;
}
void stg2(int pos,int l,int r,int v){
tag[pos]*=v;
tag[pos]%=mod;
tag2[pos]*=v;
tag2[pos]%=mod;
data[pos]*=v;
data[pos]%=mod;
return ;
}
void psd(int pos,int l,int r){
if(tag2[pos]!=1){
tag2[ls]*=tag2[pos];
tag2[ls]%=mod;
tag2[rs]*=tag2[pos];
tag2[rs]%=mod;
tag[ls]*=tag2[pos];
tag[ls]%=mod;
tag[rs]*=tag2[pos];
tag[rs]%=mod;
data[ls]*=tag2[pos];
data[ls]%=mod;
data[rs]*=tag2[pos];
data[rs]%=mod;
tag2[pos]=1;
}
if(tag[pos]){
tag[ls]+=tag[pos];
tag[ls]%=mod;
tag[rs]+=tag[pos];
tag[rs]%=mod;
data[ls]+=tag[pos];
data[ls]%=mod;
data[rs]+=tag[pos];
data[rs]%=mod;
tag[pos]=0;
}
return ;
}
void update(int pos,int l,int r,int L,int R,int v){
if(L<=l && r<=R){
stg(This,v);
return;
}
psd(This);
if(L<=mid) update(l_son,L,R,v);
if(R>=mid+1) update(r_son,L,R,v);
upd(pos);
return ;
}
void update2(int pos,int l,int r,int L,int R,int v){
if(L<=l && r<=R){
stg2(This,v);
return;
}
psd(This);
if(L<=mid) update(l_son,L,R,v);
if(R>=mid+1) update(r_son,L,R,v);
upd(pos);
return ;
}
int qry(int pos,int l,int r,int L,int R){
if(L<=l && r<=R) return data[pos]%mod;
psd(This);
int res=0;
if(L<=mid) res+=qry(ls,l,mid,L,R);
res%=mod;
if(R>mid) res+=qry(rs,mid+1,r,L,R);
return res%mod;
}
}T;
signed main(){
scanf("%lld %lld %lld",&n,&m,&mod);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
T.build(root);
while(m--){
int op,x,y,k;
scanf("%lld %lld %lld",&op,&x,&y);
if(op==1){
scanf("%lld",&k);
// printf("op:%lld\n",T.qry(root,x,y));
T.update2(root,x,y,k);
// printf("op:%lld\n",T.qry(root,x,y));
}
else if(op==2){
scanf("%lld",&k);
T.update(root,x,y,k);
}
else printf("%lld\n",T.qry(root,x,y)%mod);
}
return 0;
}