就对了#1#3#4
其他全 WA
#2#9#10超时卡常卡掉了
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int M=1e5+5;
int a[M],b[350],s,m;
int add_1[350],add_2[350];
inline int read(){
register int x=0,f=1;
register char ch=getchar();
while(!(ch>='0'&&ch<='9')){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48),ch=getchar();}
return x*f;
}
inline void print(int x){
if(x<0){putchar('-'),x=-x;}
if(x>9)print(x/10);
putchar(x%10+'0');
}
inline void down1(int x){
if(add_2[x]==0)
return;
b[x]=0;
for(register int i=x*s;i<(x+1)*s;++i){
a[i]+=add_2[x];
b[x]+=a[i];
a[i]%=m;
b[x]%=m;
}
add_2[x]=0;
}
inline void down2(int x){
if(add_1[x]==1)
return;
b[x]=0;
for(register int i=x*s;i<(x+1)*s;++i){
a[i]*=add_1[x];
b[x]+=a[i];
a[i]%=m;
b[x]%=m;
}
add_1[x]=1;
}
inline void change_1(int l,int r,int k){
register int k1=l/s,k2=r/s;
down1(k1);down1(k2);
if(k1==k2){
for(register int i=l;i<=r;++i){
b[k1]+=a[i]*(k-1);
a[i]*=k;
a[i]%=m;
b[k1]%=m;
}
}else{
for(register int i=l;i<(k1+1)*s;++i){
b[k1]+=a[i]*(k-1);
a[i]*=k;
a[i]%=m;
b[k1]%=m;
}
for(register int i=k2*s;i<=r;++i){
b[k2]+=a[i]*(k-1);
a[i]*=k;
a[i]%=m;
b[k2]%=m;
}
for(register int i=k1+1;i<k2;++i){
b[i]*=k;
add_1[i]*=k;
add_2[i]*=k;
b[i]%=m;
add_2[i]%=m;
}
}
}
inline void change_2(int l,int r,int k){
register int k1=l/s,k2=r/s;
down2(k1);down2(k2);
down1(k1);down1(k2);
if(k1==k2){
for(register int i=l;i<=r;++i){
b[k1]+=k;
a[i]+=k;
a[i]%=m;
b[k1]%=m;
}
}else{
for(register int i=l;i<(k1+1)*s;++i){
b[k1]+=k;
a[i]+=k;
a[i]%=m;
b[k1]%=m;
}
for(register int i=k2*s;i<=r;++i){
b[k2]+=k;
a[i]+=k;
a[i]%=m;
b[k2]%=m;
}
for(register int i=k1+1;i<k2;++i){
b[i]+=s*k;
add_2[i]+=k;
b[i]%=m;
add_2[i]%=m;
}
}
}
inline int query(int l,int r){
register int k1=l/s,k2=r/s,ans=0;
if(k1==k2){
for(register int i=l;i<=r;++i){
a[i]%=m;
ans+=a[i]*add_1[k1]+add_2[k1];
ans%=m;
}
}else{
for(register int i=l;i<(k1+1)*s;++i){
a[i]%=m;
ans+=a[i]*add_1[k1]+add_2[k1];
ans%=m;
}
for(register int i=k2*s;i<=r;++i){
a[i]%=m;
ans+=a[i]*add_1[k2]+add_2[k2];
ans%=m;
}
for(register int i=k1+1;i<k2;++i){
ans+=b[i];
ans%=m;
}
}
return ans;
}
int main(){
register int n,q;
n=read();q=read();m=read();
s=sqrt(n);
for(register int i=0;i<350;++i)
add_1[i]=1;
for(register int i=1;i<=n;++i){
a[i]=read();
b[i/s]+=a[i];
}
register int op,l,r,k;
while(q--){
op=read();
if(op==1){
l=read();r=read();k=read();
change_1(l,r,k);
}else if(op==2){
l=read();r=read();k=read();
change_2(l,r,k);
}else{
l=read();r=read();
print(query(l,r)%m);
putchar('\n');
}
}
return 0;
}