求条
  • 板块灌水区
  • 楼主pengbonan
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/3 17:20
  • 上次更新2024/11/3 20:43:17
查看原帖
求条
1005693
pengbonan楼主2024/11/3 17:20

记录

#include <iostream>
#define I long long
#define C constexpr
#define Inf 1e10
using namespace std;
C I N = 1e6 + 10;
I w[N << 2], Lzy[N << 2], Lzy2[N << 2], A[N];
bool f[N << 2];
#define pushup(x) w[x] = max(w[x << 1], w[x << 1 | 1]);
void build (int x, int L, int r) {
	if (L == r) {
		w[x] = A[L];
		return;
	}
	int mid = L + r >> 1;
	build(x << 1, L, mid), build(x << 1 | 1, mid + 1, r);
	pushup(x); 
}
void makeTag (int x, int Len, I k) {
	Lzy2[x] = 0;
	Lzy[x] = k;
	w[x] = k;
	f[x] = 1;
}
void makeTag2 (int x, int Len, I k) {
	Lzy2[x] += k;
	w[x] += k;
}
void pushdown (int x, int L, int r) {
	if (f[x] == 1) {
		w[x << 1] = w[x << 1 | 1] = Lzy[x] + Lzy2[x];
		Lzy[x << 1] = Lzy[x << 1 | 1] = Lzy[x];
		Lzy2[x << 1] = Lzy2[x << 1 | 1] = Lzy2[x];
		f[x << 1] = f[x << 1 | 1] = 1;
	} else {
		w[x << 1] += Lzy2[x];
		w[x << 1 | 1] += Lzy2[x];
		Lzy2[x << 1] += Lzy2[x];
		Lzy2[x << 1 | 1] += Lzy2[x];
	}
	f[x] = 0, Lzy[x] = 0, Lzy2[x] = 0;
}
I query (int x, int l, int r, int L, int R) {
	if (L <= l && r <= R) {
		return w[x];
	} else if (!(l > R || r < L)) {
		int mid = l + r >> 1;
		pushdown(x, l, r);
		I Ans = -Inf;
		if (mid >= L)
			Ans = max(Ans, query(1, l, mid, L, R));
		if (mid < R)
			Ans = max(Ans, query(1, mid + 1, r, L, R));
		return Ans; 
	} else {
		return -Inf;
	}
}
void update (int x, int l, int r, int L, int R, I k) {
	if (L <= l && r <= R) {
		makeTag(x, r - l + 1, k);
	} else {
		int mid = l + r >> 1;
		pushdown(x, l, r);
		if (mid >= L)
			update(x << 1, l, mid, L, R, k);
		if (mid < R)
			update(x << 1 | 1, mid + 1, r, L, R, k);
		pushup(x);
	}
}
void update2 (int x, int l, int r, int L, int R, I k) {
	if (L <= l && r <= R) {
		makeTag2(x, r - l + 1, k);
	} else {
		int mid = l + r >> 1;
		pushdown(x, l, r);
		if (mid >= L)
			update2(x << 1, l, mid, L, R, k);
		if (mid < R)
			update2(x << 1 | 1, mid + 1, r, L, R, k);
		pushup(x);
	}
}
signed main () {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr); 
	int n, q;
	cin >> n >> q;
	for (int i = 1; i <= n; i ++)
		cin >> A[i];
	build(1, 1, n);
	while (q --) {
		int op;
		cin >> op;
		if (op == 1) {
			int L, r, k;
			cin >> L >> r >> k;
			update(1, 1, n, L, r, k);
		} else if (op == 2) {
			int L, r, k;
			cin >> L >> r >> k;
			update2(1, 1, n, L, r, k);
		} else if (op == 3) {
			int L, r;
			cin >> L >> r;
			cout << query(1, 1, n, L, r) << '\n';
		}
	}
	return 0;
}
2024/11/3 17:20
加载中...