社区讨论
60分求调
P1253扶苏的问题参与者 3已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mhjih8ed
- 此快照首次捕获于
- 2025/11/04 03:06 4 个月前
- 此快照最后确认于
- 2025/11/04 03:06 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
long long arr[1001000],n,q;
struct node{
long long l,r,maxn;
long long add,cover;
}tree[5001000];
void build(long long l,long long r,long long idx){
tree[idx].l=l;tree[idx].r=r;tree[idx].add=0;tree[idx].cover=1e18;
if(tree[idx].l==tree[idx].r){tree[idx].maxn=arr[l];return;}
long long mid=(l+r)>>1;
build(l,mid,idx<<1);build(mid+1,r,idx<<1|1);
tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
return ;
}
void spread(long long idx){
if(tree[idx].cover!=1e18){
tree[idx<<1].maxn=tree[idx].cover;tree[idx<<1|1].maxn=tree[idx].cover;
tree[idx<<1].cover=tree[idx].cover;tree[idx<<1|1].cover=tree[idx].cover;
tree[idx<<1|1].add=0;tree[idx<<1|1].add=0;
}
if(tree[idx].add!=0){
tree[idx<<1].maxn+=tree[idx].add;tree[idx<<1|1].maxn+=tree[idx].add;
tree[idx<<1].add+=tree[idx].add;tree[idx<<1|1].add+=tree[idx].add;
}
tree[idx].cover=1e18;tree[idx].add=0;
tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
return;
}
void add(long long l,long long r,long long idx,long long w){
if(tree[idx].l>r||tree[idx].r<l) return;
if(tree[idx].l>=l&&tree[idx].r<=r){
spread(idx);
tree[idx].maxn+=w;
tree[idx].add+=w;
return;
}
spread(idx);
add(l,r,idx<<1,w);add(l,r,idx<<1|1,w);
tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
}
void cover(long long l,long long r,long long idx,long long w){
if(tree[idx].l>r||tree[idx].r<l) return ;
if(tree[idx].l>=l&&tree[idx].r<=r){
tree[idx].maxn=w;tree[idx].add=0;
tree[idx].cover=w;return;
}
spread(idx);
cover(l,r,idx<<1,w);add(l,r,idx<<1|1,w);
tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
return ;
}
long long check(long long l,long long r,long long idx){
if(tree[idx].l>r||tree[idx].r<l) return -1e16;
if(tree[idx].l>=l&&tree[idx].r<=r){
return tree[idx].maxn;
}
spread(idx);
tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
return max(check(l,r,idx<<1),check(l,r,idx<<1|1));
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
build(1,n,1);
while(q--){
int op;long long l,r,x;
cin>>op;
if(op==1){cin>>l>>r>>x;cover(l,r,1,x);}
if(op==2){cin>>l>>r>>x;add(l,r,1,x);}
if(op==3){cin>>l>>r;cout<<check(l,r,1)<<endl;}
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...