Cod sursa(job #935806)

Utilizator mvcl3Marian Iacob mvcl3 Data 4 aprilie 2013 20:02:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#define MAX_SIZE (1 << 18) + 100
using namespace std;

ifstream f("arbint.in"); ofstream g("arbint.out");

int n, k, t, a, b, poz, val, maxim, MaxArb[MAX_SIZE];
int start, finish;
void update(int, int, int);
void query (int, int, int);

int main() {
    f >> n >> k;
    for(int i = 1; i <= n; ++i) {
        f >> val;
        poz = i;
        update(1, 1, n);
    }

    for(int i = 1; i <= k; ++i) {
        f >> t >> a >> b;

        if(t) {
            poz = a, val = b;
            update(1, 1, n);
        }
        else {
            maxim = -1;
            start = a, finish = b;
            query(1, 1, n);
            g << maxim << '\n';
        }
    }
    return 0;
}

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

    int m = (st + dr) >> 1;
    if(poz <= m) update(2 * nod, st, m);
    else         update(2 * nod + 1, m + 1, dr);

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

void query( int nod, int st, int dr) {
    if(start <= st && dr <= finish) {
        if(maxim < MaxArb[nod]) maxim = MaxArb[nod];
        return;
    }

    int m = (st + dr) >> 1;
    if(start <= m) query(2 * nod, st, m);
    if(m < finish) query(2 * nod + 1, m + 1, dr);
}