样例没过,一直输出0 awa
#include<bits/stdc++.h>
using namespace std;
int n,m,p,w[100010],tree[100010*4],lazy[100010*4],tag[100010*4];
void build(int k,int l,int r){
tag[k]=1;
if(l==r){tree[k]=w[l];return ;}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
tree[k]=((tree[k*2])%p+(tree[k*2+1])%p)%p;
}
void addp(int k,int l,int r,int w,int v){
tree[k]=((tree[k]*w)%p+((r-l+1)*v)%p)%p;
lazy[k]=(lazy[k]*w+v)%p;
tag[k]=(tag[k]*w)%p;
}
void pushdown(int k,int l,int r){
int mid=(l+r)/2;
addp(k*2,l,mid,tag[k],lazy[k]);
addp(k*2+1,mid+1,r,tag[k],lazy[k]);
lazy[k]=0;tag[k]=1;
}
void uptag(int k,int l,int r,int x,int y,int w){
if(l>y||r<x)return;
if(x<=l&&r<=y){
tree[k]=(tree[k]*w)%p;
lazy[k]=(tree[k]*w)%p;
tag[k]=(tag[k]*w)%p;
return ;
}
pushdown(k,l,r);
int mid=(l+r)/2;
uptag(k*2,l,mid,x,y,w);
uptag(k*2+1,mid+1,r,x,y,w);
tree[k]=((tree[k*2])%p+(tree[k*2+1])%p)%p;
}
void uplazy(int k,int l,int r,int x,int y,int w){
if(l>y||r<x)return ;
if(x<=l&&r<=y){
tree[k]=(tree[k]+(r-l+1)*w)%p;
lazy[k]=(lazy[k]+x)%p;
return ;
}
pushdown(k,l,r);
int mid=(l+r)/2;
uplazy(k*2,l,mid,x,y,w);
uplazy(k*2+1,mid+1,r,x,y,w);
tree[k]=((tree[k*2])%p+(tree[k*2+1])%p)%p;
}
int query(int k,int l,int r,int x,int y){
if(l>y||r>x)return 0;
if(x<=l&&r<=y)return tree[k];
int mid=(l+r)/2;
return (query(k*2,l,mid,x,y)%p+query(k*2+1,mid+1,r,x,y)%p)%p;
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++)cin>>w[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int opt,x,y,k;
cin>>opt>>x>>y;
if(opt==1){
cin>>k;
uptag(1,1,n,x,y,k);
}
else if(opt==2){
cin>>k;
uplazy(1,1,n,x,y,k);
}
else if(opt==3){
cout<<query(1,1,n,x,y)<<endl;
}
}
return 0;
}