Cod sursa(job #1619442)

Utilizator blackoddAxinie Razvan blackodd Data 28 februarie 2016 16:09:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

using namespace std;

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

#define DIM 4 * (int)10e5 + 1

int n, m, valuare, poz, type, a , b;
int vmax;
int arb[DIM];

void Update(int, int, int);
void Query(int, int, int);

int main() {

    fin >> n >> m;

    for ( int i = 1; i <= n; ++i ) {
        fin >> valuare;
        poz = i;
        Update(1, 1, n);
    }

    for ( int i = 1; i <= m; ++i ) {
        fin >> type >> a >> b;
        if ( type == 0 ) {
            vmax = -1;
            Query(1, 1, n);
            fout << vmax << '\n';
        }
        else {
            poz = a, valuare = b;
            Update(1, 1, n);
        }

    }
    fin.close();
    fout.close();
    return 0;
}

void Query(int nod, int st, int dr) {

    if ( a <= st && dr <= b ) {
        vmax = max(vmax, arb[nod]);
        return;
    }
    int mid = (st + dr) / 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 ) {
        arb[nod] = valuare;
        return;
    }
    int mid = (st + dr) / 2;
    if ( poz <= mid )
        Update(nod * 2, st, mid);
    else
        Update(nod * 2 + 1, mid + 1, dr);

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