Cod sursa(job #2397667)

Utilizator MateiTrandafirMatei Trandafir MateiTrandafir Data 4 aprilie 2019 17:53:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

const int MAX_M = 100001;

int v[1 << 18], n, m;

int a, b, pos, val;

inline void update(int p, int st, int dr) {
    if (st == dr) {
        v[p] = val;
        return;
    }
    int m = (st + dr) / 2;
    if (pos <= m) update(2 * p, st, m);
    else update(2 * p + 1, m + 1, dr);
    v[p] = std::max(v[2 * p], v[2 * p + 1]);
}

inline int query(int p, int st, int dr) {
    if (a <= st && dr <= b) return v[p];
    int m = (st + dr) / 2, v1 = 0, v2 = 0;
    if (a <= m) v1 = query(2 * p, st, m);
    if (b > m) v2 = query(2 * p + 1, m + 1, dr);
    return std::max(v1, v2);
}

int main() {
    std::ifstream in("arbint.in");
    std::ofstream out("arbint.out");
    int i, x;
    in >> n >> m;
    for (pos = 1; pos <= n; ++pos) {
        in >> val;
        update(1, 1, n);
    }
    for (i = 0; i < m; ++i) {
        in >> x >> a >> b;
        if (x == 0) out << query(1, 1, n) << '\n';
        else {
            pos = a;
            val = b;
            update(1, 1, n);
        }
    }
    return 0;
}