闻灌多
  • 板块灌水区
  • 楼主zjx120213
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/2/4 21:38
  • 上次更新2025/2/5 11:24:20
查看原帖
闻灌多
855999
zjx120213楼主2025/2/4 21:38

P4513求调

9pts 对了第一个点

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct park
{
	int maxl , maxr;
	int maxn;
	int sum;
	int l , r;
}tree[500005 * 4];
int a[500005];
park operator+(park L , park R)
{
	park x;
	x.l = L.l;
	x.r = R.r;
	x.maxn = max(L.maxr + R.maxl , max(L.maxn , R.maxn));
	x.maxl = max(L.maxl , L.sum + R.maxl);
	x.maxr = max(R.maxr , R.sum + L.maxr);
	x.sum = L.sum + R.sum;
	return x;
}
void pushUP(int x)
{
	tree[x] = tree[x * 2] + tree[x * 2 + 1];
}
void build(int x , int lc , int rc)
{
	tree[x].l = lc;
	tree[x].r = rc;
	if(lc == rc)
	{
		tree[x].maxl = tree[x].maxr;
		tree[x].maxn = tree[x].sum = a[lc];
		return ;
	}
	int m = (lc + rc) / 2;
	build(x * 2 , lc , m);
	build(x * 2 + 1 , m + 1 , rc);
	pushUP(x);
}
park query(int x , int lc , int rc)
{
	if(lc <= tree[x].l && tree[x].r <= rc)
	{
		return tree[x];
	}
	int m = (tree[x].l + tree[x].r) / 2;
	if(rc <= m)
	{
		return query(x * 2 , lc , rc);
	}
	if(m < lc)
	{
		return query(x * 2 + 1 , lc , rc);
	}
	return query(x * 2 , lc , rc) + query(x * 2 + 1 , lc , rc);
}
void modify(int x , int p , int s)
{
	if(tree[x].l == tree[x].r)
	{
		tree[x].maxl = tree[x].maxr = s;
		tree[x].maxn = tree[x].sum = s;
		return ;
	}
	int m = (tree[x].l + tree[x].r) / 2;
	if(p <= m)
	{
		modify(x * 2 , p , s);
	}
	else
	{
		modify(x * 2 + 1 , p , s);
	}
	pushUP(x);
}
int n , m , p , x , y;
signed main()
{
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	build(1 , 1 , n);
	while(m--)
	{
		cin >> p >> x >> y;
		if(p == 1)
		{
			if(x > y)
			{
				swap(x , y);
			}
			cout << query(1 , x , y).maxn << endl;
		}
		else
		{
			modify(1 , x , y);
		}
	}
	return 0;
}
2025/2/4 21:38
加载中...