Cod sursa(job #2958882)

Utilizator rastervcrastervc rastervc Data 28 decembrie 2022 20:38:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int tree[400005];

static void build(int node, int l, int r) {
    if (l == r) fin >> tree[node];
    else {
        int mid = (l + r) >> 1;
        build(node << 1, l, mid);
        build((node << 1) | 1, mid + 1, r);
        tree[node] = max(tree[node << 1], tree[(node << 1) | 1]);
    }
}

static void update(int node, int l, int r, int pos, int val) {
    if (l == r) tree[node] = val;
    else {
        int mid = (l + r) >> 1;
        if (pos <= mid) update(node << 1, l, mid, pos, val);
        else update((node << 1) | 1, mid + 1, r, pos, val);
        tree[node] = max(tree[node << 1], tree[(node << 1) | 1]);
    }
}

static int query(int node, int l, int r, int a, int b) {
    if (a <= l && r <= b) return tree[node];
    else {
        int mid = (l + r) >> 1;
        int ans1 = 0, ans2 = 0;
        if (a <= mid) ans1 = query(node << 1, l, mid, a, b);
        if (mid < b) ans2 = query((node << 1) | 1, mid + 1, r, a, b);
        return max(ans1, ans2);
    }
}

int N, M, type, a, b;

int main() {
    fin >> N >> M;
    build(1, 1, N);

    for (int i = 1; i <= M; ++i) {
        fin >> type >> a >> b;
        if (type == 0) fout << query(1, 1, N, a, b) << '\n';
        else update(1, 1, N, a, b);
    }

    fin.close();
    fout.close();
    return 0;
}