Cod sursa(job #1993528)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 23 iunie 2017 11:07:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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

const int n_max = 100005;
int n, newn, p, aint[n_max * 4];

inline void Update(int p, int x) {
    int t;
    p += newn - 1;
    aint[p] = x;
    while (p) {
        if (p & 1) p--;
        t = p >> 1;
        aint[t] = max(aint[p], aint[p + 1]);
        p = t;
    }
}

int Querry(int p, int x, int y, int st, int dr) {
    if(x == st && y == dr) return aint[p];
    int mid = (st + dr) / 2;
    if(y <= mid) return Querry(2 * p, x, y, st, mid);
    if(x > mid) return Querry(2 * p + 1, x, y, mid + 1, dr);
    return max(Querry(2 * p, x, mid, st, mid),
               Querry(2 * p + 1, mid + 1, y, mid + 1, dr));
}

int main() {
    int q, i, t, a, b;
    fin >> n >> q;
    newn = 1;
    while (newn < n) {
        newn *= 2;
    }
    p = newn;
    for (i = 1; i <= n; i++) {
        fin >> aint[p++];
    }
    for (i = newn - 1; i; i--) {
        aint[i] = max(aint[i * 2], aint[i * 2 + 1]);
    }
    while (q--) {
        fin >> t >> a >> b;
        if (t == 0) {
            fout << Querry(1, a, b, 1, newn) << "\n";
        }
        else if (t == 1) {
            Update(a, b);
        }
    }
    fin.close();
    fout.close();
    return 0;
}