线段树0pts求调+悬关,码风良好
查看原帖
线段树0pts求调+悬关,码风良好
979363
zxr_zwgh楼主2024/7/27 09:35

rt,样例全0

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct st{
	int left,right;
	int maxx,maxl,maxr;
	int val=0;
}tree[400005];
int a[100005];
inline void spread(st root,st l,st r){
	if(l.maxr<0&&r.maxl<0){
		root.maxx=max(l.maxr,r.maxl);
	}else{
		root.maxx=0;
		if(l.maxr>0){
			root.maxx+=l.maxr;
		}if(r.maxl>0){
			root.maxx+=r.maxl;
		}
	}
	root.maxx=max(root.maxx,l.maxx);
	root.maxx=max(root.maxx,r.maxx);
	root.maxl=max(l.maxl,l.val+r.maxl);
	root.maxr=max(r.maxr,r.val+l.maxr);
	root.val=l.val+r.val;
}
inline void build(int l,int r,int root){
	tree[root].left=l,tree[root].right=r;
	if(tree[root].left==tree[root].right){
		tree[root].val=tree[root].maxx=tree[root].maxl=tree[root].maxr=a[l];
		return;
	} 
	int mid=(tree[root].left+tree[root].right)/2;
	build(l,mid,2*root);
	build(mid+1,r,2*root+1);
	tree[root].val=tree[root*2].val+tree[root*2+1].val;
	spread(tree[root],tree[root*2],tree[root*2+1]);
} 
void update(int root,int n,int v){
	if(tree[root].left==tree[root].right){
		tree[root].val=tree[root].maxx=tree[root].maxl=tree[root].maxr=v;
		return;
	}
	int mid=(tree[root].left+tree[root].right)/2;
	if(n<=mid) update(root*2,n,v);
	else update(root*2+1,n,v);
	spread(tree[root],tree[root*2],tree[root*2+1]);
}
inline st query(int root,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return tree[root];
	int mid=(tree[root].left+tree[root].right)/2;
	if(ql<=mid&&mid<qr){
		st reg;
		spread(reg,query(root*2,l,mid,ql,qr),query(root*2+1,mid+1,r,ql,qr));
		return reg;
	}
	else if(ql<=mid) return query(ql,qr,root*2,l,mid);
	else return query(ql,qr,root*2+1,mid+1,r);
} 
signed main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	while(m--){
		int op,x,y;
	    scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld",&x,&y);
			if(x>y) swap(x,y);
			printf("%lld\n",query(1,x,y,1,1).maxx);
		}else{
			scanf("%lld%lld",&x,&y);
			update(1,x,y);
		}
	}
	return 0;
}
2024/7/27 09:35
加载中...