Rt,蒟蒻用分块写的,拿了70pts,其余点都T了>_<,求卡常/kel
#include<bits/stdc++.h>
using namespace std;
#define timeused() (double)clock()/CLOCKS_PER_SEC
#define Set(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define repp(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define debug() assert(0)
typedef long long ll;
typedef unsigned long long ull;
template<typename T> inline T rd(T& x){
T f=1;x=0;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(T)(c-'0');
x*=f;
return x;
}
ll rd(){ll x;rd(x);return x;}
int n,m,p,L[10005],R[10005],opt,l,r,bel[1000005],siz;
ll a[1000005],sum[1000005],addtag[1000005],multag[1000005],k;
inline void res(int be){
rep(i,L[be],R[be]) a[i]=(a[i]*multag[be]+addtag[be])%p;
multag[be]=1;
addtag[be]=sum[be]=0;
rep(i,L[be],R[be]) sum[be]=(sum[be]+a[i])%p;
return;
}
inline void upd(int l,int r,ll k,bool type){
if(!type){
if(bel[l]==bel[r]){
res(bel[l]);
rep(i,l,r){
sum[bel[l]]=(sum[bel[l]]+a[i]*(k-1))%p;
a[i]=a[i]*k%p;
}
return;
}
res(bel[l]);
for(;l!=L[bel[l]];++l){
sum[bel[l]]=(sum[bel[l]]+a[l]*(k-1))%p;
a[l]=a[l]*k%p;
}
res(bel[r]);
for(;r!=R[bel[r]];--r){
sum[bel[r]]=(sum[bel[r]]+a[r]*(k-1))%p;
a[r]=a[r]*k%p;
}
rep(i,bel[l],bel[r]){
addtag[i]=addtag[i]*k%p;
multag[i]=multag[i]*k%p;
sum[i]=sum[i]*k%p;
}
return;
}
else{
if(bel[l]==bel[r]){
res(bel[l]);
rep(i,l,r){
sum[bel[l]]=(sum[bel[l]]+k)%p;
a[i]=(a[i]+k)%p;
}
return;
}
res(bel[l]);
for(;l!=L[bel[l]];++l){
sum[bel[l]]=(sum[bel[l]]+k)%p;
a[l]=(a[l]+k)%p;
}
res(bel[r]);
for(;r!=R[bel[r]];--r){
sum[bel[r]]=(sum[bel[r]]+k)%p;
a[r]=(a[r]+k)%p;
}
rep(i,bel[l],bel[r]){
addtag[i]=(addtag[i]+k)%p;
sum[i]=(sum[i]+k*siz)%p;
}
return;
}
}
inline int query(int l,int r){
ll ans=0;
if(bel[l]==bel[r]){
res(bel[l]);
rep(i,l,r) ans=(ans+a[i])%p;
return ans;
}
res(bel[l]);
for(;l!=L[bel[l]];++l) ans=(ans+a[l])%p;
res(bel[r]);
for(;r!=R[bel[r]];--r) ans=(ans+a[r])%p;
rep(i,bel[l],bel[r]) ans=(ans+sum[i])%p;
return ans;
}
int main(){
n=rd();
m=rd();
p=rd();
siz=ceil(sqrt(n)+1);
rep(i,1,n) a[i]=rd();
rep(i,1,siz){
L[i]=(i-1)*siz+1;
R[i]=i*siz;
addtag[i]=0;
multag[i]=1;
rep(j,L[i],R[i]){
bel[j]=i;
sum[i]=(sum[i]+a[j])%p;
}
}
while(m--){
opt=rd();
if(opt==1){
l=rd();
r=rd();
k=rd();
upd(l,r,k,0);
}
if(opt==2){
l=rd();
r=rd();
k=rd();
upd(l,r,k,1);
}
if(opt==3){
l=rd();
r=rd();
printf("%d\n",query(l,r));
}
}
return 0;
}