Cod sursa(job #2546856)

Utilizator ioana_marinescuMarinescu Ioana ioana_marinescu Data 14 februarie 2020 17:29:42
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

const int MAX_N = 100000;

using namespace std;

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

int n, q;
int aint[4 * MAX_N + 5];

void update(int nod, int st, int dr, int index, int val) {
    if (st == dr)
        aint[nod] = val;
    else {
        int mij = (st + dr) / 2;
        if (index <= mij)
            update(2 * nod, st, mij, index, val);
        else
            update(2 * nod + 1, mij + 1, dr, index, val);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }
}

int query(int nod, int st, int dr, int l, int r) {
    if (st == l && dr == r)
        return aint[nod];
    else {
        int mij = (st + dr) / 2;
        if (r <= mij)
            return query(2 * nod, st, mij, l, r);
        else if (mij < l)
            return query(2 * nod + 1, mij + 1, dr, l, r);
        else
            return max(query(2 * nod, st, mij, l, mij), query(2 * nod + 1, mij + 1, dr, mij + 1, r));
    }
}

int main() {
    fin >> n >> q;
    for (int i = 1; i <= n; i++) {
        int x;
        fin >> x;
        update(1, 1, n, i, x);
    }

    while (q--) {
        int t, a, b;
        fin >> t >> a >> b;
        if (t == 0)
            fout << query(1, 1, n, a, b) << '\n';
        else
            update(1, 1, n, a, b);
    }

    return 0;
}