90pts WA求调教
查看原帖
90pts WA求调教
487383
imnoob楼主2025/2/8 09:36

玄关

#include <bits/stdc++.h>
#define Code using
#define by namespace
#define zzx std
#define MINN -0x7fffffffffffffff
Code by zzx;
int n, m;
long long a[1000010];
long long d[4000010], tag1[4000010], tag2[4000010];
void build(int s, int t, int p)
{
	tag2[p] = MINN;
	if(s == t)
	{
		d[p] = a[s];
		return;
	}
	int mid = (s + t) >> 1;
	build(s, mid, p * 2), build(mid + 1, t, p * 2 + 1);
	d[p] = max(d[p * 2], d[p * 2 + 1]);
}
void coverdown(int s, int t, int p)
{
	if(tag2[p] != MINN)
	{
		tag1[p * 2] = 0, tag1[p * 2 + 1] = 0;
		tag2[p * 2] = tag2[p], tag2[p * 2 + 1] = tag2[p];
		d[p * 2] = tag2[p], d[p * 2 + 1] = tag2[p];
		tag2[p] = MINN;
	}
}
void adddown(int s, int t, int p)
{
	if(tag1[p])
	{
		coverdown(s, t, p);
		tag1[p * 2] += tag1[p], tag1[p * 2 + 1] += tag1[p];
		d[p * 2] += tag1[p], d[p * 2 + 1] += tag1[p];
		tag1[p] = 0;
	}
}
void pushdown(int s, int t, int p)
{
	coverdown(s, t, p); adddown(s, t, p);
}
void update1(int s, int t, int l, int r, long long k, int p)
{
	//cout << s << ' ' << t << ' ' << l << ' ' << r << ' ' << p << ' ' << d[p] << '\n';
	if(l <= s && t <= r)
	{
		coverdown(s, t, p);
		d[p] += k, tag1[p] += k;
		return;
	}
	pushdown(s, t, p);
	int mid = (s + t) >> 1;
	if(l <= mid) update1(s, mid, l, r, k, p * 2);
	if(mid < r) update1(mid + 1, t, l, r, k, p * 2 + 1);
	d[p] = max(d[p * 2], d[p * 2 + 1]);
}
void update2(int s, int t, int l, int r, long long k, int p)
{
	//cout << s << ' ' << t << ' ' << l << ' ' << r << ' ' << p << ' ' << d[p] << '\n';
	if(l <= s && t <= r)
	{
		d[p] = k, tag1[p] = 0, tag2[p] = k;
		return;
	}
	pushdown(s, t, p);
	int mid = (s + t) >> 1;
	if(l <= mid) update2(s, mid, l, r, k, p * 2);
	if(mid < r) update2(mid + 1, t, l, r, k, p * 2 + 1);
	d[p] = max(d[p * 2], d[p * 2 + 1]);
}
long long query(int s, int t, int l, int r, int p)
{
	//cout << s << ' ' << t << ' ' << l << ' ' << r << ' ' << p << ' ' << d[p] << '\n';
	if(l <= s && t <= r) return d[p];
	pushdown(s, t, p);
	int mid = (s + t) >> 1;
	long long res = MINN;
	if(l <= mid) res = max(res, query(s, mid, l, r, p * 2));
	if(mid < r) res = max(res, query(mid + 1, t, l, r, p * 2 + 1));
	return res;
}
int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
	{
		cin >> a[i];
	}
	build(1, n, 1);
	while(m--)
	{
		int opt, l, r;
		long long x;
		cin >> opt >> l >> r;
		if(opt == 1)
		{
			cin >> x;
			update2(1, n, l, r, x, 1);
		}
		else if(opt == 2)
		{
			cin >> x;
			update1(1, n, l, r, x, 1);
		}
		else cout << query(1, n, l, r, 1) << '\n';
	}
	return 0;
} 
2025/2/8 09:36
加载中...