WA0样例可过,求助,Thanks♪(・ω・)ノ
查看原帖
WA0样例可过,求助,Thanks♪(・ω・)ノ
355521
rainbow_star楼主2022/11/21 17:21
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=500001;
ll n,m;
ll a[N];
struct node
{
	ll sum,lmax,rmax,dat;
}t[N*4],lft,rght,b;
ll cnt,x,y,k;
void build(ll node,ll l,ll r)
{
	if(l==r)
	{
		t[node].sum=t[node].lmax=t[node].rmax=t[node].dat=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(node*2+1,l,mid);
	build(node*2+2,mid+1,r);
	t[node].sum=t[node*2+1].sum+t[node*2+2].sum;
	t[node].lmax=max(t[node*2+1].lmax,t[node*2+1].sum+t[node*2+2].lmax);
	t[node].rmax=max(t[node*2+2].rmax,t[node*2+2].sum+t[node*2+1].rmax);
	t[node].dat=max(max(t[node*2+1].dat,t[node*2+2].dat),t[node*2+1].rmax+t[node*2+2].lmax);
}
void change(ll node,ll l,ll r,ll x,ll y)
{
	if(l==r)
	{
		a[l]=t[node].sum=t[node].lmax=t[node].rmax=t[node].dat=y;
		return;
	}
	ll mid=(l+r)>>1;
	if(x<=mid)
		change(node*2+1,l,mid,x,y);
	else
		change(node*2+2,mid+1,r,x,y);
	t[node].sum=t[node*2+1].sum+t[node*2+2].sum;
	t[node].lmax=max(t[node*2+1].lmax,t[node*2+1].sum+t[node*2+2].lmax);
	t[node].rmax=max(t[node*2+2].rmax,t[node*2+2].sum+t[node*2+1].rmax);
	t[node].dat=max(max(t[node*2+1].dat,t[node*2+2].dat),t[node*2+1].rmax+t[node*2+2].lmax);
}
node summ(ll node,ll l,ll r,ll L,ll R)
{
	if(l>=L&&r<=R)
		return t[node];
	ll mid=(l+r)>>1;
	if(R<=mid)//整个区间在mid左边 
		return summ(node*2+1,l,mid,L,R);
	if(L>mid)//整个区间在mid右边 
		return summ(node*2+2,mid+1,r,L,R);
	lft=summ(node*2+1,l,mid,L,mid);
	rght=summ(node*2+2,mid+1,r,mid+1,R);
	b.sum=lft.sum+rght.sum;
	b.lmax=max(lft.lmax,lft.sum+rght.lmax);
	b.rmax=max(rght.rmax,rght.sum+lft.rmax);
	b.dat=max(lft.rmax+rght.lmax,max(lft.dat,rght.dat));
	return b;
}
int main()
{
	scanf("%lld",&n);
	ll i;
	for(i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(0,1,n);
	scanf("%lld",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%lld",&cnt);
		scanf("%lld%lld",&x,&y);
		if(cnt==0)//change
			change(0,1,n,x,y);
		else//求和
			printf("%lld\n",summ(0,1,n,x,y).dat);
	}
	return 0;
}
2022/11/21 17:21
加载中...