Cod sursa(job #828151)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 3 decembrie 2012 11:07:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
using namespace std;

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

const int INF  = (1<<29);

int n,x[100020],i,j,a[301000],m,op,p,q;


inline int build(int i, int li, int ls) {
    if(li > ls)
        return -INF;

    if(li == ls) {
        a[i] = x[li];
        return a[i];
    }
    
    a[i] = max(
        build(2*i  , li,         (li+ls)/2 ),
        build(2*i+1, (li+ls)/2+1,  ls        )
    );
    return a[i];
}

inline int chg(int i, int li, int ls, int v, int pos) {
    if(pos < li || pos > ls) {
        return a[i];
    }
    if(li == ls && li == pos) {
        a[i] = v;
        return a[i];
    }
    return a[i] = max(chg(2*i, li, (li+ls)/2, v, pos), chg(2*i+1, (li+ls)/2+1, ls, v, pos));
}

inline int query(int i, int li, int ls, int qi, int qs) {
    if(qs < li || qi > ls)
        return -INF;
    if(li >= qi && ls <= qs)
        return a[i];
    return max(query(2*i, li, (li+ls)/2, qi, qs), query(2*i+1, (li+ls)/2+1, ls, qi, qs));
}

int main() {
    in>>n>>m;
    for(i=1; i<=n; i++) {
        in>>x[i];
    }
    build(1, 1, n);
    for(i=1; i<=m; i++) {
        in>>op>>p>>q;
        if(op == 0) {
            out<<query(1, 1, n, p, q)<<'\n';
        } else {
            chg(1, 1, n, q, p);
        }
    }
    return 0;
}