Cod sursa(job #2961869)

Utilizator vladrochianVlad Rochian vladrochian Data 7 ianuarie 2023 11:21:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>

using namespace std;

const int N_MAX = 100000;
const int INF = 1e9;

int N, M;
int v[N_MAX + 5];
int a[4 * N_MAX + 5];

void build(int node, int l, int r) {
    if (l == r) {
        a[node] = v[l];
        return;
    }
    int m = (l + r) >> 1;
    int leftSon = node << 1, rightSon = leftSon | 1;
    build(leftSon, l, m);
    build(rightSon, m + 1, r);
    a[node] = max(a[leftSon], a[rightSon]);
}

void update(int node, int l, int r, int pos, int val) {
    if (l == r) {
        a[node] = val;
        return;
    }
    int m = (l + r) >> 1;
    int leftSon = node << 1, rightSon = leftSon | 1;
    if (pos <= m) {
        update(leftSon, l, m, pos, val);
    } else {
        update(rightSon, m + 1, r, pos, val);
    }
    a[node] = max(a[leftSon], a[rightSon]);
}

int query(int node, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr) {
        return a[node];
    }
    int m = (l + r) >> 1;
    int leftSon = node << 1, rightSon = leftSon | 1;
    int ans = -INF;
    if (ql <= m) {
        ans = max(ans, query(leftSon, l, m, ql, qr));
    }
    if (qr > m) {
        ans = max(ans, query(rightSon, m + 1, r, ql, qr));
    }
    return ans;
}

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

    fin >> N >> M;
    for (int i = 1; i <= N; ++i) {
        fin >> v[i];
    }
    build(1, 1, N);
    while (M--) {
        int q, x, y;
        fin >> q >> x >> y;
        if (q == 0) {
            fout << query(1, 1, N, x, y) << "\n";
        } else {
            update(1, 1, N, x, y);
        }
    }
    return 0;
}