Cod sursa(job #1613708)

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

using namespace std;

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

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

void query(int nod, int st, int dr) {
    if (a <= st && b >= dr) // daca ma pozitionez pe un interval [st, dr] mai mic decat intervalul [a, b]
        Max = max(Max, Arb[nod]); // calculez informatia ceruta

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

        if (a <= mid)
            query(nod*2, st, mid);
        if (mid < b)
            query(nod*2+1, mid+1, dr);
    }
}

void update(int nod, int st, int dr) {
    if (st == dr) // 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*2, st, mid); // actualizez fiu stanga cu intervalul [st, mid]
        else
            update(nod*2+1, mid+1, dr); // actualizez fiu dreapta cu intervalul [mid+1, dr]

        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) {
            Max = -1;
            query(1, 1, n);
            fout << Max << "\n";

            continue;
        }

        if (t) {
            update(1, 1, n);

            continue;
        }
    }

    return 0;
}