Cod sursa(job #1650172)

Utilizator LolkekzorChiorean Tudor Lolkekzor Data 11 martie 2016 16:59:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int arbore[4 * 100000 + 50], n, m, val, pos, i, st, dr, q;

void updateArbore(int nod, int lhs, int rhs) {
    if (lhs == rhs) {
        arbore[nod] = val;
        return;
    }

    int mijl = ( lhs + rhs ) / 2;
    if (pos <= mijl)
        updateArbore(nod * 2, lhs, mijl);
    else
        updateArbore(nod * 2 + 1, mijl + 1, rhs);

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

int findMax(int nod, int lhs, int rhs) {
    if (lhs > dr || rhs < st)
        return -1;

    int mijl = ( lhs + rhs ) / 2;
    if (lhs >= st && rhs <= dr)
        return arbore[nod];

    return max(findMax(nod * 2, lhs, mijl), findMax(nod * 2 + 1, mijl + 1, rhs));
}

int main()
{
    fin>>n>>m;
    for (i = 1 ; i <= n ; i++) {
        fin>>val; pos = i;
        updateArbore(1, 1, n);
    }

    for (i = 1 ; i <= m ; i++) {
        fin>>q>>pos>>val;
        if (q == 1) {
            updateArbore(1, 1, n);
        } else {
            st = pos; dr = val;
            fout<<findMax(1, 1, n)<<'\n';
        }
    }

    return 0;
}