xiarui1 @ 2024-08-31 21:24:28
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lson cur*2
#define rson cur*2+1
const int N=1000010;
int n,m,op,l,r,x,a[N];
struct node{
int l,r,val,tag,add;
}segt[4*N];
void pushup(int cur){
segt[cur].val=max(segt[lson].val,segt[rson].val);
}
void pushdown(int cur){
if(segt[cur].add){
segt[lson].add+=segt[cur].add;
segt[lson].val+=segt[cur].add;
segt[rson].add+=segt[cur].add;
segt[rson].val+=segt[cur].add;
segt[cur].add=0;
}
if(segt[cur].tag!=INT_MIN){
segt[lson].tag=segt[cur].tag;
segt[lson].val=segt[cur].tag;
segt[lson].add=0;
segt[rson].tag=segt[cur].tag;
segt[rson].val=segt[cur].tag;
segt[rson].add=0;
segt[cur].tag=INT_MIN;
}
}
void maketree(int cur,int l,int r){
segt[cur].l=l;
segt[cur].r=r;
segt[cur].tag=INT_MIN;
if(l==r){
segt[cur].val=a[l];
return;
}
int mid=(l+r)/2;
maketree(lson,l,mid);
maketree(rson,mid+1,r);
pushup(cur);
}
int query(int cur,int l,int r){
if(l<=segt[cur].l and segt[cur].r<=r){
return segt[cur].val;
}
int mid=(segt[cur].l+segt[cur].r)/2;
int res=-1145141919810;
pushdown(cur);
if(l<=mid) res=max(res,query(lson,l,mid));
if(r>mid) res=max(res,query(rson,mid+1,r));
return res;
}
void modify1(int cur,int l,int r,int delta){
if(l<=segt[cur].l and segt[cur].r<=r){
segt[cur].add=0;
segt[cur].tag=delta;
segt[cur].val=delta;
return;
}
pushdown(cur);
int mid=(segt[cur].l+segt[cur].r)/2;
if(l<=mid) modify1(lson,l,r,delta);
if(r>mid) modify1(rson,l,r,delta);
pushup(cur);
}
void modify2(int cur,int l,int r,int delta){
if(l<=segt[cur].l and segt[cur].r<=r){
segt[cur].add+=delta;
segt[cur].val+=delta;
return;
}
pushdown(cur);
int mid=(segt[cur].l+segt[cur].r)/2;
if(l<=mid) modify2(lson,l,r,delta);
if(r>mid) modify2(rson,l,r,delta);
pushup(cur);
}
signed main(){
freopen("P1253_2.in","r",stdin);
freopen("P1253.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
maketree(1,1,n);
for(int i=0;i<m;i++){
cin>>op;
if(op==1){
cin>>l>>r>>x;
modify1(1,l,r,x);
}else if(op==2){
cin>>l>>r>>x;
modify2(1,l,r,x);
}else{
cin>>l>>r;
cout<<query(1,l,r)<<"\n";
}
// for(int i=1;i<=n;i++){
// cout<<query(1,i,i)<<" ";
// }
// cout<<"\n\n";
}
return 0;
}
by FwbAway @ 2024-09-20 13:01:56
@xiarui1 咱俩错误一样,我也正在求调
by Yang18630303 @ 2024-10-01 13:47:02
@FwbAway @xiarui1 +1(doge
by Joker_IV @ 2024-10-30 18:37:35
@FwbAway @xiarui1 @Yang18630303
+1,所以你们调出来了吗,我搞不懂啊
码
by Yang18630303 @ 2024-10-30 21:19:19
@Joker_IV 线段树主体代码有误好像就是这样