线段树9pts求调,悬一关
查看原帖
线段树9pts求调,悬一关
593255
dist_22r楼主2023/11/19 15:34
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,a[N];
struct tree{
	int ml,mr,ans,sum;
}t[4*N];
void push_in(int u)
{
	t[u].sum=t[2*u].sum+t[2*u+1].sum;
	t[u].ml=max(t[u*2].ml,t[u*2].sum+t[u*2+1].ml);
	t[u].mr=max(t[u*2+1].mr,t[u*2].mr+t[2*u+1].sum);
	t[u].ans=max(max(t[u*2].ans,t[u*2+1].ans),t[u*2].mr+t[u*2+1].ml);
}
void build(int u,int l,int r)
{
	if(l==r)
	{
		t[u].ml=t[u].mr=t[u].sum=t[u].ans=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	push_in(u);
}
tree query(int u,int l,int r,int a,int b)
{
	if(l>=a&&r<=b)
	{
		return t[u];
	}
	int mid=(l+r)/2;
	if(b<=mid)
	{
		return query(u*2,l,mid,a,b);
	}
	else if(a>mid)
	{
		return query(u*2+1,mid+1,r,a,b);
	}
	else
	{
		tree s,x=query(u*2,l,mid,a,b),y=query(u*2+1,mid+1,r,a,b);
		s.ml=max(x.ml,x.sum+y.ml);
		s.mr=max(x.mr,x.mr+y.sum);
		s.ans=max(max(x.ans,y.ans),x.mr+y.ml);
		return s;
	}
}
void update(int u,int l,int r,int a,int b)
{
	if(l==r)
	{
		t[u].ml=t[u].mr=t[u].sum=t[u].ans=b;
		return ;
	}
	int mid=(l+r)/2;
	if(a<=mid)
	{
		update(u*2,l,mid,a,b);
	}
	else
	{
		update(u*2+1,mid+1,r,a,b);
	}
	push_in(u);
}
int main()
{
	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 a,b,op;
		cin>>op>>a>>b;
		if(op==1)
		{
			if(a>b)
			{
				swap(a,b);
			}
			cout<<query(1,1,n,a,b).ans<<endl;
		}
		else
		{
			update(1,1,n,a,b);
		}
	}
	return 0;
}
2023/11/19 15:34
加载中...