Cod sursa(job #3184743)

Utilizator vladsoartavlad sofronea vladsoarta Data 16 decembrie 2023 17:57:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb

#include<fstream>

using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");

#define NMAX 500005

int AINT[4*NMAX];

///nod = 1, st = 1, dr = 8

void update(int nod, int st, int dr, int pos, int val) {
    if (st == dr) {
        AINT[nod] = val;
        return;
    }

    int mid = (st+dr)/2;
    if (pos <= mid) {
        update(2*nod, st, mid, pos, val);
    } else {
        update(2*nod+1, mid+1, dr, pos, val);
    }

    AINT[nod] = max(AINT[2*nod], AINT[2*nod+1]);
}

int query(int nod, int st, int dr, int L, int R) {
    if (L <= st && dr <= R) {
        return AINT[nod];
    }

    int mid = (st+dr)/2;
    int a = 0, b = 0;

    if (L <= mid) {
        a = query(nod*2, st, mid, L, R);
    }

    if (mid < R) {
        b = query(nod*2+1, mid+1, dr, L, R);
    }

    return max(a, b);
}

int n, m;
int v[NMAX];

int main() {

    cin >> n >> m;
    for (int i = 1; i<=n; i++) {
        cin >> v[i];
        update(1, 1, n, i, v[i]);
    }

    for (int i = 1; i<=m; i++) {
        bool op;
        int a, b;
        cin >> op >> a >> b;

        if (op == 0) {
            cout << query(1, 1, n, a, b) << "\n";
        } else {
            update(1, 1, n, a, b);
        }
    }

    return 0;
}