样例是过了的,打样例(#!)的第一个是对的,第二个就错了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rc p<<1
#define lc p<<1|1
const int N=1e5+10;
struct edge{
int l,r,sum,add,add2;
}t[N*4];
int w[N],n,m;
void push_down(int p){
if(t[p].add){
t[lc].sum+=(t[lc].r-t[lc].l+1)*t[p].add;
t[rc].sum+=(t[rc].r-t[rc].l+1)*t[p].add;
t[lc].add+=t[p].add;
t[rc].add+=t[p].add;
t[p].add=0;
}
if(t[p].add2){
t[lc].sum*=t[p].add2;
t[rc].sum*=t[p].add2;
t[lc].add2+=t[p].add2;
t[rc].add2+=t[p].add2;
t[p].add2=0;
}
}
void push_up(int p){
t[p].sum=t[lc].sum+t[rc].sum;
return ;
}
void build(int p,int l,int r){
t[p].l=l;
t[p].r=r;
if(l==r){
t[p].sum=w[l];
return;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
push_up(p);
}
void updata(int p,int x,int y,int k){
if(x<=t[p].l&&t[p].r<=y){
t[p].sum+=(t[p].r-t[p].l+1)*k;
t[p].add+=k;
return ;
}
int mid=(t[p].r+t[p].l)>>1;
push_down(p);
if(x<=mid) updata(lc,x,y,k);
if(y>mid) updata(rc,x,y,k);
push_up(p);
}
void updata2(int p,int x,int y,int k){
if(x<=t[p].l&&t[p].r<=y){
t[p].sum*=k;
t[p].add2+=k;
return ;
}
int mid=(t[p].r+t[p].l)>>1;
push_down(p);
if(x<=mid) updata2(lc,x,y,k);
if(y>mid) updata2(rc,x,y,k);
push_up(p);
}
int q(int p,int x,int y){
if(x<=t[p].l&&t[p].r<=y){
return t[p].sum;
}
int mid=t[p].l+t[p].r>>1;
push_down(p);
int sm=0;
if(x<=mid){
sm+=q(lc,x,y);
}
if(y>mid){
sm+=q(rc,x,y);
}
return sm;
}
signed main(){
int v;
cin>>n>>v>>m;
for(int i=1;i<=n;i++){
cin>>w[i];
}
build(1,1,n);
for(int i=1;i<=v;i++){
int in,x,y;
cin>>in;
if(in==1){
int k;
cin>>x>>y>>k;
updata2(1,x,y,k);
}
if(in==2){
int k;
cin>>x>>y>>k;
updata(1,x,y,k);
}
if(in==3){
cin>>x>>y;
cout<<q(1,x,y)%m<<endl;
}
}
return 0;
}