萌新初学线段树60分求调!
  • 板块P1531 I Hate It
  • 楼主hehe123313
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/22 20:39
  • 上次更新2023/12/22 22:20:46
查看原帖
萌新初学线段树60分求调!
1091535
hehe123313楼主2023/12/22 20:39
#include<iostream>

using namespace std;
const int N = 8 * 1E5 + 10;
struct tree {
    int l;
    int r;
    int maxnum;
} tr[N];
int n, m;
int a[N];

void pushup(int u) {
    tr[u].maxnum = max(tr[2 * u].maxnum, tr[2 * u + 1].maxnum);
}

void build(int u, int l, int r) {
    if (l == r)
        tr[u] = {l, r, a[l]};
    else {
        tr[u]={l,r};
        int mid = l + r >> 1;
        build(2 * u, l, mid);
        build(2 * u + 1, mid + 1, r);
        pushup(u);
    }

}

int query(int u, int l, int r) {
    int ans = -1e7;
    if (tr[u].l >= l && tr[u].r <= r)
        return tr[u].maxnum;
    else {
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid)
            ans = query(2 * u, l, r);
        if (r > mid)
            ans = max(ans, query(2 * u + 1, l, r));
    }
    return ans;
}

void modify(int u, int x, int k) {
    if (tr[u].l == tr[u].r)
    {
        tr[u].maxnum=k;
        return ;
    }
    else {
        int mid = tr[u].l + tr[u].r >> 1;
        if (x <= mid)
            modify(2 * u, x, k);
       else
            modify(2 * u + 1, x, k);
        pushup(u);
    }
}

int main() {
    cin >> n>>m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    build(1, 1, n);
    while (m--) {
        char c;
        int l, r;
        cin >> c;
        if (c == 'Q') {
            cin >> l >> r;
            cout << query(1, l, r) << endl;
        }
        if (c == 'U') {
            cin >> l >> r;
            if (a[l] >= r)
                continue;
            else
                modify(1, l, r);
        }
    }

    return 0;
}
2023/12/22 20:39
加载中...