刚学,思路混乱加码风乱。
样例可以过,但 wa 的一分不得。
求条。
#include<iostream>
#include<cstdio>
#define lp p<<1
#define rp p<<1|1
#define mid l+(r-l)/2
using namespace std;
const int M=1e5+5;
int a[M];
int t[M<<2],add_1[M<<2],add_2[M<<2];
void build(int l,int r,int p){
if(l==r){
t[p]=a[l];
return;
}
build(l,mid,lp);
build(mid+1,r,rp);
t[p]=t[lp]+t[rp];
}
void update_1(int l,int r,int k,int p){
t[p]*=k;
add_2[p]*=k;
add_1[p]*=k;
}
void down_1(int l,int r,int p){
if(add_1[p]==1)
return;
update_1(l,mid,add_1[p],lp);
update_1(mid+1,r,add_1[p],rp);
add_1[p]=1;
}
void change_1(int l,int r,int x,int y,int k,int p){
if(r<x||l>y)
return;
if(x<=l&&r<=y){
update_1(l,r,k,p);
return;
}
down_1(l,r,p);
change_1(l,mid,x,y,k,lp);
change_1(mid+1,r,x,y,k,rp);
t[p]=t[lp]+t[rp];
}
void update_2(int l,int r,int k,int p){
t[p]+=(l-r+1)*k;
add_2[p]+=k;
}
void down_2(int l,int r,int p){
if(!add_2)
return;
update_2(l,mid,add_2[p],lp);
update_2(mid+1,r,add_2[p],rp);
add_2[p]=0;
}
void change_2(int l,int r,int x,int y,int k,int p){
if(r<x||l>y){
return;
}
if(x<=l&&r<=y){
update_2(l,r,k,p);
return;
}
down_2(l,r,p);
change_2(l,mid,x,y,k,lp);
change_2(mid+1,r,x,y,k,rp);
t[p]=t[lp]+t[rp];
}
int query(int l,int r,int x,int y,int p){
if(r<x||l>y)
return 0;
if(x<=l&&r<=y){
return t[p];
}
down_1(l,r,p);
down_2(l,r,p);
return query(l,mid,x,y,lp)+query(mid+1,r,x,y,rp);
}
int main(){
int n,q,m;
scanf("%d%d%d",&n,&q,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<(M<<2);i++){
add_1[i]=1;
}
build(1,n,1);
int op,l,r,k;
while(q--){
scanf("%d%d%d",&op,&l,&r);
if(op==1){
scanf("%d",&k);
change_1(1,n,l,r,k,1);
}else if(op==2){
scanf("%d",&k);
change_2(1,n,l,r,k,1);
}else{
printf("%d\n",query(1,n,l,r,1)%m);
}
}
return 0;
}