Cod sursa(job #1373420)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 4 martie 2015 18:34:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

const int kNMax = 100000;
int aint[4 * kNMax], poz, val, a, b, sol;

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

void Query(int nod, int st, int dr) {
    if(a <= st && dr <= b) {
        sol = max(sol, aint[nod]);
        return;
    }
    int mij = (st + dr) / 2, fiu_stanga = 2 * nod, fiu_dreapta = fiu_stanga + 1;
    if (mij >= a)
        Query(fiu_stanga, st, mij);
    if (b > mij)
        Query(fiu_dreapta, mij + 1, dr);
}

int main() {
    int n, m, optiune;
    in >> n >> m;
    for (int i = 1; i <= n; ++i) {
        in >> val;
        poz = i;
        Update(1, 1, n);
    }
    while (m--) {
        in >> optiune;
        if (optiune) {
            in >> poz >> val;
            Update(1, 1, n);
        } else {
            in >> a >> b;
            sol = 0;
            Query(1, 1, n);
            out << sol << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}