社区讨论

试图去逛公园被糖掉了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 条回复,欢迎继续交流。

正在加载回复...