看了半天不知道错哪了,求佬调
#include "iostream"
#include "vector"
#define ll long long
using namespace std;
typedef struct tree_node{
ll l,r;
ll sum,add,change_num;
bool is_change=0;
};
tree_node tree[4000100];
ll nums[1000100];
void mark_tag(int p,ll add,ll change_num,bool is_change){
//如果change了,则add=0
//先change,后add
//先add,后change
if(is_change){
tree[p].sum=change_num+add;
tree[p].change_num=change_num;
tree[p].add = add;
tree[p].is_change=true;
}
else{
tree[p].add += add;
tree[p].sum += add;
}
}
void push_up(int p){
tree[p].sum= max(tree[p*2].sum,tree[p*2+1].sum);
}
void push_down(int p){
mark_tag(p*2,tree[p].add,tree[p].change_num,tree[p].is_change);
mark_tag(p*2+1,tree[p].add,tree[p].change_num,tree[p].is_change);
tree[p].add=0;
tree[p].is_change=false;
}
void build_tree(ll l,ll r,ll p){
tree[p].l=l;
tree[p].r=r;
if(l==r){
tree[p].sum=nums[l];
return;
}
ll mid= (l+r)/2;
build_tree(l,mid,p*2);
build_tree(mid+1,r,p*2+1);
push_up(p);
}
void update_add(ll target_l,ll target_r,ll d,ll p){
ll r=tree[p].r,l=tree[p].l;
if(r<target_l || l>target_r){
return ;
}
if(l>=target_l && r<=target_r){
mark_tag(p,d,tree[p].change_num,false);
return;
}
push_down(p);
update_add(target_l,target_r,d,p*2);
update_add(target_l,target_r,d,p*2+1);
push_up(p);
}
void update_change(ll target_l,ll target_r,ll d,ll p){
ll r=tree[p].r,l=tree[p].l;
if(r<target_l || l>target_r){
return ;
}
if(l>=target_l && r<=target_r){
mark_tag(p,0,d,true);
return;
}
push_down(p);
update_change(target_l,target_r,d,p*2);
update_change(target_l,target_r,d,p*2+1);
push_up(p);
}
ll get_sum(ll target_l,ll target_r,ll p){
ll r=tree[p].r,l=tree[p].l;
if(r<target_l || l>target_r){
return 0;
}
if(l>=target_l && r<=target_r){
return tree[p].sum;
}
push_down(p);
return max(get_sum(target_l,target_r,p*2),get_sum(target_l,target_r,p*2+1));
}
int main(){
ll n,q;
std::ios::sync_with_stdio(false);
cin>>n>>q;
for(ll i=1;i<=n;i++){
cin>>nums[i];
}
build_tree(1,n,1);
for(ll i=0;i<q;++i){
ll op;
cin>>op;
if(op==1){
ll l,r,d;
cin>>l>>r>>d;
update_change(l,r,d,1);
}
else if(op==2){
ll l,r,d;
cin>>l>>r>>d;
update_add(l,r,d,1);
}
else{
ll l,r;
cin>>l>>r;
cout<<get_sum(l,r,1)<<endl;
}
}
}