RT,样例过了,但全WA
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],p;
struct note{
int l;
int r;
long long sum;
long long add;
long long mul;
}t[500005];
void build(long long p,long long l,long long r){
t[p].l=l;
t[p].r=r;
if(l==r){
t[p].sum=a[l]%p;
return;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].sum=(t[p*2].sum+t[p*2+1].sum)%p;
t[p].mul=1;
return;
}
void add(long long x){
if(t[x].add){
t[x*2].sum=(t[x*2].sum*t[x].mul+t[x].add*(t[x*2].r-t[x*2].l+1))%p;
t[x*2+1].sum=(t[x*2+1].sum*t[x].mul+t[x].add*(t[x*2+1].r-t[x*2+1].l+1))%p;
t[x*2].mul=(t[x*2].mul*t[x].mul)%p;
t[x*2+1].mul=(t[x*2+1].mul*t[x].mul)%p;
t[x*2].add=(t[x*2].add*t[x].mul+t[x].add)%p;
t[x*2+1].add=(t[x*2+1].add*t[x].mul+t[x].add)%p;
t[x].mul=1;
t[x].add=0;
}
return;
}
void change2(int i,int l,int r,long long k){ // *
if(t[i].l>=l&&t[i].r<=r){
t[i].sum=(t[i].sum*k)%p;
t[i].mul=(t[i].mul*k)%p;
t[i].add=(t[i].add*k)%p;
return;
}
add(i);
long long mid=(t[i].l+t[i].r)>>1;
if(l<=mid)change2(i*2,l,r,k);
if(r>mid)change2(i*2+1,l,r,k);
t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
return;
}
void change1(int i,int l,int r,long long k){ // +
if(t[i].l>=l&&t[i].r<=r){
t[i].sum=(t[i].sum+(t[i].r-t[i].l+1)*k)%p;
t[i].add=(t[i].add+k)%p;
return;
}
add(i);
long long mid=(t[i].l+t[i].r)>>1;
if(l<=mid)change1(i*2,l,r,k);
if(r>mid)change1(i*2+1,l,r,k);
t[i].sum=t[i*2].sum+t[i*2+1].sum;
return;
}
long long sum(long long p,long long l,long long r){
if(t[p].l>=l&&t[p].r<=r)return t[p].sum;
add(p);
long long mid=(t[p].l+t[p].r)>>1,ans=0;
if(l<=mid)
ans+=sum(p*2,l,r);
if(r>mid)
ans+=sum(p*2+1,l,r);
return ans;
}
int main(){
// freopen("xds.in","r",stdin);
// freopen("xds.out","w",stdout);
long long i,j,k,x,y;
cin>>n>>m>>p;
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for(i=1;i<=m;i++){
scanf("%lld%lld%lld",&j,&x,&y);
if(j==1){
scanf("%lld",&k);
change2(1,x,y,k);
}
if(j==2){
scanf("%lld",&k);
change1(1,x,y,k);
}
if(j==3)
cout<<(sum(1,x,y)%p)<<endl;
}
return 0;
}