Cod sursa(job #1626690)

Utilizator razvandRazvan Dumitru razvand Data 3 martie 2016 11:15:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#define MAX 100000

using namespace std;

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

int arb[4*MAX+1];

void update(int nod, int left, int right, int pos, int val) {

    if(left == right) {
        arb[nod] = val;
        return;
    }

    int div = (left+right)/2;

    if(pos <= div)
        update(2*nod, left, div, pos, val);
    else
        update(2*nod+1, div+1, right, pos, val);

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

}

void query(int nod, int left, int right, int start, int finish, int &mx) {

    if(start <= left && right <= finish) {
        if(mx < arb[nod])
            mx = arb[nod];
        return;
    }

    int div = (left+right)/2;

    if(start <= div)
        query(2*nod, left, div, start, finish, mx);
    if(div < finish)
        query(2*nod+1, div+1, right, start, finish, mx);

}

int main() {

    int n,m,a,b,t;
    in >> n >> m;

    for(int i = 1; i <= n; i++) {
        in >> a;
        update(1, 1, n, i, a);
    }

    for(int i = 1; i <= m; i++) {

        in >> t >> a >> b;

        if(t == 0) {
            int mx = -1;
            query(1, 1, n, a, b, mx);
            out << mx << '\n';
        } else
            update(1, 1, n, a, b);

    }

    return 0;
}