rt,样例和数据一的第一个询问过了
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline void in (int &x){
int f=1;x=0;char c=getchar();
while (c>'9'||c<'0'){if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
x*=f;
}
int bl,bn,n,m,op,p,x,y,k;
int a[100005],L[500],R[500],id[100005];
int sum[505],tag1[505],tag2[505];
inline void update1 (int l,int r,int k){
if (id[l]==id[r]){
for (int i=l;i<=r;++i){
sum[id[i]]+=a[i]*(k-1);
sum[id[i]]%=p;a[i]*=k;a[i]%=p;
}
return ;
}
for (int i=l;i<=R[id[l]];++i){
sum[id[l]]+=a[i]*(k-1);
sum[id[l]]%=p;a[i]*=k;a[i]%=p;
}
for (int i=r;i>=L[id[r]];--i){
sum[id[r]]+=a[i]*(k-1);
sum[id[r]]%=p;a[i]*=k;a[i]%=p;
}
for (int i=id[l]+1;i<=id[r]-1;++i){
sum[i]*=k;sum[i]%=p;
tag1[i]*=k;tag1[i]%=p;
tag2[i]*=k;tag2[i]%=p;
}
}
inline void update2 (int l,int r,int k){
if (id[l]==id[r]){
for (int i=l;i<=r;++i){
sum[id[i]]+=k;sum[id[i]]%=p;
a[i]+=k;a[i]%=p;
}
return ;
}
for (int i=l;i<=R[id[l]];++i){
sum[id[l]]+=k;sum[id[r]]%=p;
a[i]+=k;a[i]%=p;
}
for (int i=r;i>=L[id[r]];--i){
sum[id[r]]+=k;sum[id[r]]%=p;
a[i]+=k;a[i]%=p;
}
for (int i=id[l]+1;i<=id[r]-1;++i){
tag2[i]+=k;tag2[i]%=p;
sum[i]+=bl*k;sum[i]%=p;
}
}
inline int query (int l,int r){
int ans=0;
if (id[l]==id[r]){
for (int i=l;i<=r;++i){
ans+=tag1[id[i]]*a[i]+tag2[id[i]];
ans%=p;
}
return ans;
}
for (int i=l;i<=R[id[l]];++i){
ans+=tag1[id[l]]*a[i]+tag2[id[l]];
ans%=p;
}
for (int i=r;i>=L[id[r]];--i){
ans+=tag1[id[r]]*a[i]+tag2[id[r]];
ans%=p;
}
for (int i=id[l]+1;i<=id[r]-1;++i){
ans+=sum[i];ans%=p;
}
return ans;
}
signed main (){
in (n);in (m);in (p);
for (int i=1;i<=n;++i) in (a[i]);
bl=(int) (sqrt (n)),bn=ceil (n*1./bl);
for (int i=1;i<=n;++i)
id[i]=(i-1)/bl+1;
for (int i=1;i<=bn;++i){
L[i]=(i-1)*bl+1;R[i]=i*bl;tag1[i]=1;
}
for (int i=1;i<=n;++i){
sum[id[i]]+=a[i];
sum[id[i]]%=p;
}
R[bn]=n;
for (int i=1;i<=m;++i){
in (op);in (x);in (y);
if (op==1){in (k);update1 (x,y,k);}
if (op==2){in (k);update2 (x,y,k);}
if (op==3){printf ("%lld\n",query (x,y));}
}
return 0;
}