20pts求助
查看原帖
20pts求助
461572
hys52楼主2022/10/29 01:05

只过了#1#3点,求调

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define lson (id << 1)
#define rson (id << 1 | 1)

inline void read(int &x) {
	x = 0; int f = 1; char ch = getchar();
	while (!isdigit(ch)) f = ch == '-' ? -1 : f, ch = getchar();
	while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
	x *= f;
}

inline void write1(int x) {
	if (x < 0) putchar('-'), x = -x;
	if (x >= 10) write1(x / 10);
	putchar(x % 10 + '0');
}

inline void write(int x) {
	if (x == 0) putchar('0');
	else write1(x);
}

const int N = 1e6 + 5;
const int INF = 1e18;
int n, q;
struct SegmentTree {
	int l, r, val = -INF, p1, p2;
	bool flag;
} tree[N << 2];

void build(int id, int l, int r) {
	tree[id].l = l, tree[id].r = r;
	if (l == r) {
		read(tree[id].val);
		return;
	}
	int mid = (l + r) >> 1;
	build(lson, l, mid);
	build(rson, mid + 1, r);
	tree[id].val = max(tree[lson].val, tree[rson].val);
}

void spread(int id) {
	if (tree[id].flag) {
		tree[lson].p1 = tree[id].p1;
		tree[rson].p1 = tree[id].p1;
		tree[lson].p2 = tree[id].p2;
		tree[rson].p2 = tree[id].p2;
		tree[lson].val = tree[id].p1 + tree[id].p2;
		tree[rson].val = tree[id].p1 + tree[id].p2;
		tree[lson].flag = true;
		tree[rson].flag = true;
	} else {
		tree[lson].p2 += tree[id].p2;
		tree[rson].p2 += tree[id].p2;
		tree[lson].val += tree[id].p2;
		tree[rson].val += tree[id].p2;
	}
	tree[id].p1 = 0;
	tree[id].p2 = 0;
	tree[id].flag = false;
}

void update1(int id, int l, int r, int v) {
	int L = tree[id].l, R = tree[id].r;
	if (l <= L && r >= R) {
		tree[id].p1 = v;
		tree[id].p2 = 0;
		tree[id].val = v;
		tree[id].flag = true;
		return;
	}
	spread(id);
	int mid = (L + R) >> 1;
	if (l <= mid) update1(lson, l, r, v);
	if (r > mid) update1(rson, l, r, v);
	tree[id].val = max(tree[lson].val, tree[rson].val);
}

void update2(int id, int l, int r, int v) {
	int L = tree[id].l, R = tree[id].r;
	if (l <= L && r >= R) {
		tree[id].p2 += v;
		tree[id].val += v;
		return;
	}
	spread(id);
	int mid = (L + R) >> 1;
	if (l <= mid) update1(lson, l, r, v);
	if (r > mid) update1(rson, l, r, v);
	tree[id].val = max(tree[lson].val, tree[rson].val);
}

int query(int id, int l, int r) {
	int L = tree[id].l, R = tree[id].r;
	if (l <= L && r >= R) return tree[id].val;
	spread(id);
	int mid = (L + R) >> 1, res = -INF;
	if (l <= mid) res = max(res, query(lson, l, r));
	if (r > mid) res = max(res, query(rson, l, r));
	return res;
}

signed main() {
	read(n); read(q);
	build(1, 1, n);
	while (q--) {
		int op;
		read(op);
		if (op == 1) {
			int l, r, x;
			read(l); read(r); read(x);
			update1(1, l, r, x);
		} else if (op == 2) {
			int l, r, x;
			read(l); read(r); read(x);
			update2(1, l, r, x);
		} else {
			int l, r;
			read(l); read(r);
			write(query(1, l, r));
			puts("");
		}
	}
	return 0;
}
2022/10/29 01:05
加载中...