萌新刚学线段树求条
查看原帖
萌新刚学线段树求条
255169
__LePetitPrince__楼主2023/9/29 22:11

样例都过不去 Orz

#include <iostream>
#define lc (o << 1)
#define rc (o << 1 | 1)
using namespace std;
const int S = 2e5 + 5;
int n, q;
int a[S], mx[4 * S];
void pushup(int o) {
	mx[o] = max(mx[lc], mx[rc]);
	return;
}
void build(int o, int l, int r) {
	if (l == r) {
		mx[l] = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(lc, l, mid);
	build(rc, mid + 1, r);
	pushup(o);
}
void update(int o, int l, int r, int p, int v) {
	if (l == r) {
		mx[o] = max(mx[o], v);
		return;
	}
	int mid = l + r >> 1;
	if (p <= mid) {
		update(lc, l, mid, p, v);
	}
	if (mid < p) {
		update(rc, mid + 1, r, p, v);
	}
	pushup(o);
}
int query(int o, int l, int r, int ql, int qr) {
	if (ql <= l && r <= qr) {
		return mx[o];
	}
	int mid = l + r >> 1;
	int ans = -1;
	if (ql <= mid) {
		ans = max(ans, query(lc, l, mid, ql, qr));
	}
	if (mid < qr) {
		ans = max(ans, query(rc, mid + 1, r, ql, qr));
	}
	return ans;
}
int main() {
	cin >> n >> q;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	build(1, 1, n);
	char op; int a, b;
	while (q--) {
		cin >> op >> a >> b;
		if (op == 'Q') {
			cout << query(1, 1, n, a, b) << endl;
		} else {
			update(1, 1, n, a, b);
		}
	}
	return 0;
} 
2023/9/29 22:11
加载中...