Cod sursa(job #1324542)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 22 ianuarie 2015 15:30:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

const int kNMax = 400010;

int n, m, val, poz, MaxArb[kNMax], start, stop, sol;

void Update(int nod, int st, int dr) {
    if (st == dr) {
        MaxArb[nod] = val;
        return;
    }
    int mij = (st + dr) / 2;
    if (poz <= mij)
        Update(2 * nod, st, mij);
    else
        Update(2 * nod + 1, mij + 1, dr);
    MaxArb[nod] = max (MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}

void Query(int nod, int st, int dr) {
    if (st >= start && dr <= stop) {
        sol = max (sol, MaxArb[nod]);
        return;
    }
    int mij = (st + dr) /2;
    if (mij >= start)
        Query(2 * nod, st, mij);
    if (stop > mij)
        Query(2 * nod + 1, mij + 1, dr);
}

int main () {
    int i, x, y, caz;
    in >> n >> m;
    for (i = 1; i <= n; ++i) {
        in >> val;
        poz = i;
        Update(1, 1, n);
    }
    for (i = 1; i <= m; ++i) {
        in >> caz >> x >> y;
        if (caz) {
            poz = x;
            val = y;
            Update(1, 1, n);
        }
        if (!caz) {
            sol = -1;
            start = x;
            stop = y;
            Query(1, 1, n);
            out << sol << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}