代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const long long inf=LLONG_MAX;
struct node{
int l,r;
bool use;
long long add_tag,change_tag,maxi=-inf;
};
int n,q,a[N];
node tr[N<<2];
void build(int p,int l,int r){
tr[p].l=l,tr[p].r=r;
if(l==r){
tr[p].maxi=a[l];
return;
}
int mid=l+r>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
tr[p].maxi=max(tr[p<<1].maxi,tr[p<<1|1].maxi);
}
inline void pushdown(int p){
if(tr[p].use){
tr[p].use=0;
tr[p<<1].change_tag=tr[p<<1|1].change_tag=tr[p].change_tag;
tr[p<<1].add_tag+=tr[p].add_tag,tr[p<<1|1].add_tag+=tr[p].add_tag;
tr[p<<1].maxi=tr[p<<1|1].maxi=tr[p].change_tag+tr[p].add_tag;
tr[p].add_tag=0;
return;
}
tr[p<<1].add_tag+=tr[p].add_tag,tr[p<<1|1].add_tag+=tr[p].add_tag;
tr[p<<1].maxi+=tr[p].add_tag,tr[p<<1|1].maxi+=tr[p].add_tag;
tr[p].add_tag=0;
return;
}
void upd(int p,int l,int r,int num,int type){
if(type==1){
if(l<=tr[p].l&&tr[p].r<=r){
tr[p].maxi=tr[p].change_tag=num,tr[p].add_tag=0,tr[p].use=1;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) upd(p<<1,l,r,num,type);
if(mid<r) upd(p<<1|1,l,r,num,type);
tr[p].maxi=max(tr[p<<1].maxi,tr[p<<1|1].maxi);
return;
}
if(l<=tr[p].l&&tr[p].r<=r){
tr[p].maxi+=num,tr[p].add_tag+=num;
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) upd(p<<1,l,r,num,type);
if(mid<r) upd(p<<1|1,l,r,num,type);
tr[p].maxi=max(tr[p<<1].maxi,tr[p<<1|1].maxi);
return;
}
long long query(int p,int l,int r){
if(l<=tr[p].l&&tr[p].r<=r) return tr[p].maxi;
long long res=-inf;
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(l<=mid) res=max(res,query(p<<1,l,r));
if(mid<r) res=max(res,query(p<<1|1,l,r));
return res;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> q;
for(int i=1;i<=n;++i) cin >> a[i];
build(1,1,n);
for(int i=1,l,r,x,opt;i<=q;++i){
cin >> opt;
if(opt==1){
cin >> l >> r >> x;
upd(1,l,r,x,1);
}
else if(opt==2){
cin >> l >> r >> x;
upd(1,l,r,x,2);
}
else{
cin >> l >> r;
cout << query(1,l,r) << '\n';
}
}
return 0;
}
根据题面的话应该是1操作挂了,但是蒟蒻看不出来qwq
求帮助