社区讨论
试图去逛公园被糖掉了QwQ
P4513小白逛公园参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mlhjhp9c
- 此快照首次捕获于
- 2026/02/11 12:38 上周
- 此快照最后确认于
- 2026/02/12 23:55 7 天前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define N 500005
#define ls rt<<1
#define rs rt<<1|1
struct node{
int l,r,sum,val,lv,rv;
}tree[N<<2];
int n,m,a[N];
void push_up(int rt){
tree[rt].sum=tree[ls].sum+tree[rs].sum;
tree[rt].val=max(max(tree[ls].val,tree[rs].val),tree[ls].rv+tree[rs].lv);
tree[rt].lv=max(tree[ls].lv,tree[rs].lv+tree[ls].sum);
tree[rt].rv=max(tree[rs].rv,tree[ls].rv+tree[rs].sum);
return;
}
void build(int rt,int x,int y){
tree[rt].l=x,tree[rt].r=y;
if(x==y){
tree[rt].sum=a[x];
tree[rt].val=a[x];
tree[rt].lv=a[x];
tree[rt].rv=a[x];
return;
}
int mid=(x+y)>>1;
build(ls,x,mid);
build(rs,mid+1,y);
push_up(rt);
return;
}
void update(int rt,int x,int z){
if(x==tree[rt].l&&tree[rt].r==x){
tree[rt].sum=z;
tree[rt].lv=z;
tree[rt].rv=z;
return;
}
int mid=(tree[rt].l+tree[rt].r)>>1;
if(x<=mid) update(ls,x,z);
if(x>mid) update(rs,x,z);
push_up(rt);
return;
}
int query(int rt,int x,int y){
if(x<=tree[rt].l&&y>=tree[rt].r) return tree[rt].val;
int ret=-1e18,mid=(tree[rt].l+tree[rt].r)>>1;
if(x<=mid) ret=max(ret,query(ls,x,y));
if(y>mid) ret=max(ret,query(rs,x,y));
push_up(rt);
return ret;
}
signed main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int opt,x,y;
cin>>opt>>x>>y;
if(opt==2) update(1,x,y);
else{
if(x>y) swap(x,y);
cout<<query(1,x,y)<<'\n';
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...