P1253扶苏的问题
WA 0分
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,a[N],s,o,d,g;
struct node{
int l,r,sum,tag,tag2;
}tre[N<<2];
void pushup(int num){
tre[num].sum=max(tre[num<<1].sum,tre[num<<1|1].sum);
}
void pushdown(int num){
if(tre[num].tag!=0){
tre[num<<1].tag+=tre[num].tag;
tre[num<<1|1].tag+=tre[num].tag;
tre[num<<1].sum+=tre[num].tag;
tre[num<<1|1].sum+=tre[num].tag;
tre[num].tag=0;
}
if(tre[num].tag2!=INT_MIN){
tre[num<<1].tag=tre[num<<1|1].tag=0;
tre[num<<1].tag2=tre[num<<1|1].tag2=tre[num].tag2;
tre[num<<1].sum=tre[num<<1|1].sum=tre[num].tag2;
tre[num].tag2=INT_MIN;
}
}
void build(int num,int ll,int rr){
tre[num].l=ll;
tre[num].r=rr;
tre[num].tag=0;
tre[num].tag2=INT_MIN;
if(ll==rr){
tre[num].sum=a[ll];
return ;
}
int mid=ll+rr>>1;
build(num<<1,ll,mid);
build(num<<1|1,mid+1,rr);
pushup(num);
}
void modify(int num,int L,int R,int x){
if(tre[num].r<L||tre[num].l>R)return ;
if(tre[num].l>=L && tre[num].r<=R){
tre[num].sum+=x;
tre[num].tag+=x;
return ;
}
pushdown(num);
modify(num<<1,L,R,x);
modify(num<<1|1,L,R,x);
pushup(num);
}
void modify2(int num,int L,int R,int x){
if(tre[num].r<L||tre[num].l>R)return ;
if(tre[num].l>=L && tre[num].r<=R){
tre[num].sum=x;
tre[num].tag2=x;
tre[num].tag=0;
return ;
}
pushdown(num);
modify(num<<1,L,R,x);
modify(num<<1|1,L,R,x);
pushup(num);
}
int query(int num,int L,int R){
if(tre[num].r<L||tre[num].l>R)return 0;
if(tre[num].l>=L && tre[num].r<=R)return tre[num].sum;
pushdown(num);
return max(query(num<<1,L,R),query(num<<1|1,L,R));
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
cin>>s;
if(s==1){
cin>>o>>d>>g;
modify2(1,o,d,g);
}
else if(s==2){
cin>>o>>d>>g;
modify(1,o,d,g);
}
else{
cin>>o>>g;
cout<<query(1,o,g)<<endl;
}
// for(int i=1;i<=n;i++){
// cout<<query(1,i,i)<<" ";
// }
// cout<<endl;
}
return 0;
}
modify2函数目的为赋值,但运行时变成增值
蒟蒻百思不得解,求大佬提点