60pts求调
查看原帖
60pts求调
733791
Collapsar233楼主2024/10/26 11:19

rt,WA on #7 #8 #9 #10

#include<iostream>
using namespace std;
typedef long long ll;

const int maxn = 1e6+7;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int n, m, a[maxn];

struct Node
{
	ll mx, chg, ad;
	bool tag;
}t[maxn << 2];

void Build(int p, int l, int r)
{
	if (l == r)
	{
		t[p].mx = a[l];
		return;
	}
	int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
	Build(ls, l, mid);
	Build(rs, mid + 1, r);
	t[p].mx = max(t[ls].mx, t[rs].mx);
	return;
}

void pushdown(int p)
{
	if (t[p].tag)
	{
		int ls = p << 1, rs = p << 1 | 1;
		t[ls].tag = t[rs].tag = true;
		t[ls].chg = t[rs].chg = t[p].chg;
		t[ls].mx = t[rs].mx = t[p].chg + t[p].ad;
	}
	else
	{
		int ls = p << 1, rs = p << 1 | 1;
		ll ad = t[p].ad;
		t[ls].ad += ad;
		t[rs].ad += ad;
		t[ls].mx += ad;
		t[rs].mx += ad;
	}
	t[p].tag = false;
	t[p].ad = t[p].chg = 0;
	return;
}

void Add(int p, int l, int r, int L, int R, int k)
{
	if (L <= l && r <= R)
	{
		t[p].ad += k;
		t[p].mx += k;
		return;
	}
	pushdown(p);
	int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
	if (L <= mid)
		Add(ls, l, mid, L, R, k);
	if (mid < R)
		Add(rs, mid + 1, r, L, R, k);
	t[p].mx = max(t[ls].mx, t[rs].mx);
	return;
}

void Change(int p, int l, int r, int L, int R, ll k)
{
	if (L <= l && r <= R)
	{
		t[p].mx = t[p].chg = k;
		t[p].ad = 0;
		t[p].tag = true;
		return;
	}
	pushdown(p);
	int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
	if (L <= mid)
		Change(ls, l, mid, L, R, k);
	if (mid < R)
		Change(rs, mid + 1, r, L, R, k);
	t[p].mx = max(t[ls].mx, t[rs].mx);
	return;
}

ll Query(int p, int l, int r, int L, int R)
{
	if (L <= l && r <= R)
		return t[p].mx;
	pushdown(p);
	ll res = -INF;
	int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
	if (L <= mid)
		res = max(res, Query(ls, l, mid, L, R));
	if (mid < R)
		res = max(res, Query(rs, mid + 1, r, L, R));
	return res;
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	Build(1, 1, n);
	int op, l, r, x;
	for (int i = 1; i <= m; ++i)
	{
		scanf("%d%d%d", &op, &l, &r);
		if (op == 1)
		{
			scanf("%d", &x);
			Change(1, 1, n, l, r, x);
		}
		else if (op == 2)
		{
			scanf("%d", &x);
			Add(1, 1, n, l, r, x);
		}
		else
			cout << Query(1, 1, n, l, r) << "\n";
	}
	return 0;
}
2024/10/26 11:19
加载中...