烂了,样例都没过QwQ
查看原帖
烂了,样例都没过QwQ
1392084
yaoyunxiang楼主2025/7/28 12:26

烂了烂了

#include <bits/stdc++.h>
using namespace std;
#define error_not_found -1428571428571428ll
#define inf 10000000000000011ll
using lint = long long;
vector<lint> a, tree, lazy, numl;
void push_up(int u) {
	tree[u] = max(tree[u << 1], tree[u << 1 | 1]);
	return ;
}
void build(int L, int R, int rec) {
	numl[rec] = inf;
	if (L == R) {
		tree[rec] = a[L];
		return;
	}
	int mid = L + ((R - L) >> 1);
	build(L, mid, rec << 1);
	build(mid + 1, R, rec << 1 | 1);
	push_up(rec);
	return ;
}
int query_ele(int p, int rec, int L, int R) {
	if (L == R) {
		return tree[rec];
	}
	int mid = L + ((R - L) >> 1);
	if (mid >= p) {
		return query_ele(p, rec << 1, L, mid);
	} else {
		return query_ele(p, rec << 1 | 1, mid + 1, R);
	}
}
bool inrange(int l, int r, int L, int R) {
	return ((L <= l) && (R >= r));
}
bool outofrange(int l, int r, int L, int R) {
	return ((R < l) || (L > r));
}
void apply2(int u, lint x) {
	if (numl[u] != inf) {
		numl[u] += x;
	} else {
		lazy[u] += x;
	}
	tree[u] += x;
}
void apply1(int u, lint x) {
	lazy[u] = 0;
	tree[u] = x;
	numl[u] = x;
}
void push_down(int rec) {
	if (numl[rec] != inf) {
//		int mid = L + ((R - L) >> 1);
		apply1(rec << 1, numl[rec]);
		apply1(rec << 1 | 1, numl[rec]);
		numl[rec] = inf;
	}
	if (lazy[rec] != 0) {
//		int mid = L + ((R - L) >> 1);
		apply2(rec << 1, lazy[rec]);
		apply2(rec << 1 | 1, lazy[rec]);
		lazy[rec] = 0;
	}
}
lint query_interv(int l, int r, int p, int L, int R) {
	if (inrange(l, r, L, R)) {
		return tree[p];
	} else if (!outofrange(l, r, L, R)) {
		int mid = l + ((r - l) >> 1);
		push_down(p);
		return max(query_interv(l, mid, p << 1, L, R),
		           query_interv(mid + 1, r, p << 1 | 1, L, R));
	} else return error_not_found;
}
void add_interv(int l, int r, int p, int L, int R, lint x) {
	if (inrange(l, r, L, R)) {
		apply2(p, x);
		return ;
	} else if (!outofrange(l, r, L, R)) {
		int mid = L + ((R - L) >> 1);
		push_down(p);

		add_interv(l, r, p << 1, L, mid, x) ;
		add_interv(l, r, p << 1 | 1, mid + 1, R, x) ;
		push_up(p);
	}

}
void fix_interv(int l, int r, int p, int L, int R, lint x) {
	if (inrange(l, r, L, R)) {
		apply1(p, x);
		return ;
	} else if (!outofrange(l, r, L, R)) {
		int mid = L + ((R - L) >> 1);
		push_down(p);

		fix_interv(l, r, p << 1, L, mid, x) ;
		fix_interv(l, r, p << 1 | 1, mid + 1, R, x) ;
		push_up(p);
	}

}
int main() {
	int n, q;
	cin >> n >> q;
	a.resize(n + 2);
	tree.resize(4 * n + 1);
	lazy.resize(4 * n + 1);
	numl.resize(4 * n + 1);
	for (int i = 1 ; i <= n ; i ++) {
		cin >> a[i];
	}
	build(1, n, 1);
	while (q --) {
		int opt;
		cin >> opt;
		if (opt == 1) {
			int x, y, z;
			cin >> x >> y >> z;
			fix_interv(x, y, 1, 1, n, z);
		} else if (opt == 2) {
			int x, y, z;
			cin >> x >> y >> z;
			add_interv(x, y, 1, 1, n, z);
		} else {
			int x, y;
			cin >> x >> y;
			cout << query_interv(x, y, 1, 1, n) << '\n';
		}
//		for(int i = 1 ; i <= 2 * n - 1 ; i ++){
//			cout << tree[i] << " ";
//		}
//		cout << "\n---------------\n";
	}
	return 0;
}
2025/7/28 12:26
加载中...