线段树求调
  • 板块P1531 I Hate It
  • 楼主_HyperV_
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/3/16 19:22
  • 上次更新2023/10/23 21:23:39
查看原帖
线段树求调
676412
_HyperV_楼主2023/3/16 19:22
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1;
int n, m, x, y, t[N], a[N];

#define lc(p) (p << 1)
#define rc(p) (p << 1 | 1)

inline void push_up(int rt) {t[rt]=max(t[lc(rt)],t[rc(rt)]);}

void build(int rt, int l, int r)
{
	if (l == r) {t[rt] = a[l]; return;}
	int mid = (l + r) >> 1;
	build(lc(rt), l, mid); build(rc(rt), mid + 1, r);
	push_up(rt);
}

void change(int rt, int l, int r, int p, int k)
{
	if (l == p && p == r)
	{
        if (t[rt] < k) 
            t[rt] = k;
		return;
	}
	int mid = (l + r) >> 1;
	if (p <= mid) change(lc(rt), l, mid, p, k);
	else change(rc(rt), mid + 1, r, p, k);
	push_up(rt);
}
int query(int rt, int l, int r, int x, int y)
{
	if (l <= x && y <= r) 
		return t[rt];
	int mid = (x + y) >> 1, ans = -1;
	if (l <= mid) 
		ans = max(ans, query(lc(rt), l, r, x, mid));
	if (r > mid)  
		ans = max(ans, query(rc(rt), l, r, mid + 1, y));
	return ans;
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) 
        cin >> a[i];
	build(1, 1, n);
	while (m--)
	{
		char opt; cin >> opt;
		if (opt == 'U')
		{
			cin >> x >> y;
			if (a[x] < y)
				a[x] = y, change(1, 1, n, x, y);
		}
		else
		{
			cin >> x >> y;
			cout << query(1, 1, n, x, y) << endl;
		}
	}
	return 0;
}
2023/3/16 19:22
加载中...