社区讨论

9ptsWA求调

P4513小白逛公园参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjcvnie
此快照首次捕获于
2025/11/04 00:29
4 个月前
此快照最后确认于
2025/11/04 00:29
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define lson (u<<1)
#define rson (u<<1|1)
#define mid ((l+r)>>1)
#define int long long
using namespace std;
const int maxn=5e5+5;
int n,m;
int a[maxn];
struct segtree{
	struct treenode{
		bool flag;
		int l,r;
		int sum,mxl,mxr,ans;
		treenode operator +(const treenode &other)const{
			if((!other.flag)&&(!flag))return {0,0,0,0,0,0,0};
			if(!other.flag)return *this;
			if(!flag)return other;
			treenode ans;
			ans.flag=true;
			ans.l=l,ans.r=other.r;
			ans.sum=sum+other.sum;
			ans.mxl=max(mxl,sum+other.mxl);
			ans.mxr=max(other.mxr,other.sum+mxr);
			ans.ans=max({ans.mxl,ans.mxr,mxr+other.mxl});
			return ans;
		}
	}tree[maxn<<2];
	void pushup(int u){
		tree[u]=tree[lson]+tree[rson];
	}
	void build(int u,int l,int r){
		tree[u].l=l,tree[u].r=r,tree[u].flag=true;
		if(l==r){
			tree[u].sum=tree[u].mxl=tree[u].mxr=tree[u].ans=a[l];
			return;
		}
		build(lson,l,mid);
		build(rson,mid+1,r);
		pushup(u);
	}
	treenode query(int u,int L,int R){
		int l=tree[u].l,r=tree[u].r;
		if(L>r||R<l)return {0,0,0,0,0,0,0};
		if(L<=l&&r<=R)return tree[u];
		return query(lson,L,R)+query(rson,L,R);
	}
	void update(int u,int x,int y){
		int l=tree[u].l,r=tree[u].r;
		if(r<x||l>x)return;
		if(l==r){
			tree[u].ans=tree[u].mxl=tree[u].mxr=tree[u].sum=y;
			return;
		}
		update(lson,x,y);
		update(rson,x,y);
		pushup(u);
	}
}seg;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	seg.build(1,1,n);
	while(m--){
		int op;
		cin>>op;
		if(op==1){
			int l,r;
			cin>>l>>r;
			if(l>r)swap(l,r);
			cout<<seg.query(1,l,r).ans<<endl;
		}else{
			int x,y;
			cin>>x>>y;
			seg.update(1,x,y);
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...