社区讨论
70pts球条
P1253扶苏的问题参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mjso87rp
- 此快照首次捕获于
- 2025/12/30 22:17 2 个月前
- 此快照最后确认于
- 2026/01/02 20:25 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5,nailong=4e9+7;
#define mid ((l+r)>>1)
int n,q;
struct Tree{
int maxx,lazy1,lazy2;
}tree[4*N];
int a[N];
int ls(int x){return x*2;}
int rs(int x){return x*2+1;}
void pushup(int x){
tree[x].maxx=max(tree[ls(x)].maxx,tree[rs(x)].maxx);
return;
}
void build(int l,int r,int x){
if(l==r){
tree[x].maxx=a[l];
tree[x].lazy2=0;
return;
}
tree[x].lazy1=nailong;
tree[x].lazy2=0;
build(l,mid,ls(x));
build(mid+1,r,rs(x));
pushup(x);
return;
}
void pushdown(int x){
if(tree[x].lazy1!=nailong){
tree[ls(x)].maxx=tree[x].lazy1;
tree[rs(x)].maxx=tree[x].lazy1;
tree[ls(x)].lazy1=tree[x].lazy1;
tree[rs(x)].lazy1=tree[x].lazy1;
tree[ls(x)].lazy2=0;
tree[rs(x)].lazy2=0;
tree[x].lazy1=nailong;
}
if(tree[x].lazy2){
tree[ls(x)].maxx+=tree[x].lazy2;
tree[rs(x)].maxx+=tree[x].lazy2;
tree[ls(x)].lazy2+=tree[x].lazy2;
tree[rs(x)].lazy2+=tree[x].lazy2;
tree[x].lazy2=0;
}
return;
}
void update1(int l,int r,int x,int L,int R,int k){
if(L<=l&&r<=R){
tree[x].maxx=k;
tree[x].lazy1=k;
tree[x].lazy2=0;
return;
}
pushdown(x);
if(L<=mid)update1(l,mid,ls(x),L,R,k);
if(R>=mid+1)update1(mid+1,r,rs(x),L,R,k);
pushup(x);
return;
}
void update2(int l,int r,int x,int L,int R,int k){
if(L<=l&&r<=R){
tree[x].maxx+=k;
tree[x].lazy2+=k;
return;
}
pushdown(x);
if(L<=mid)update2(l,mid,ls(x),L,R,k);
if(R>=mid+1)update2(mid+1,r,rs(x),L,R,k);
pushup(x);
return;
}
int query(int l,int r,int x,int L,int R){
if(L<=l&&r<=R){
return tree[x].maxx;
}
pushdown(x);
int res=-nailong;
if(L<=mid)res=query(l,mid,ls(x),L,R);
if(R>=mid+1)res=max(res,query(mid+1,r,rs(x),L,R));
return res;
}
signed 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,n,1);
while(q--){
int l,r,x,op;
cin>>op;
if(op==1){
cin>>l>>r>>x;
update1(1,n,1,l,r,x);
}else if(op==2){
cin>>l>>r>>x;
update2(1,n,1,l,r,x);
}else{
cin>>l>>r;
cout<<query(1,n,1,l,r)<<'\n';
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...