Cod sursa(job #1613759)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 25 februarie 2016 16:59:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
# include <fstream>
# define MAXN   100010

using namespace std;

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

int Arb[4*MAXN], Max, n, m, t, x, a, b, i;

int query(int nod, int st, int dr) {
    if (a <= st && b >= dr) // [st, dr] este inclus in [a, b]
        return Arb[nod]; // returnez informatia ceruta

    int mid = st + (dr - st) / 2;
    int x1, x2;
    x1 = x2 = 0;

    if (a <= mid)
        x1 = query(nod<<1, st, mid); // fiu stanga
    if (mid < b)
        x2 = query((nod<<1)+1, mid+1, dr); // fiu dreapta

    return max(x1, x2);
}

void update(int nod, int st, int dr) {
    if (st >= a && dr <= a) // daca am ajuns in frunza (interval elementar)
        Arb[nod] = b; // il actualizez cu valoarea citita

    else {
        int mid = st + (dr - st) / 2;

        if (a <= mid)
            update(nod<<1, st, mid); // fiu stanga
        else
            update((nod<<1)+1, mid+1, dr); // fiu dreapta

        Arb[nod] = max(Arb[nod*2], Arb[nod*2+1]); // calculez informatia nodului curent, in functie de cei doi fii ai sai
    }
}

int main() {
    fin >> n >> m;
    for (i=1; i<=n; ++i) {
        fin >> x;
        a = i; b = x;
        update(1, 1, n);
    }

    for (i=1; i<=m; ++i) {
        fin >> t >> a >> b;

        if (t == 0)
            fout << query(1, 1, n) << "\n";
        else
            update(1, 1, n);
    }

    return 0;
}