Cod sursa(job #1101730)

Utilizator lilian_ciobanuLilian Ciobanu lilian_ciobanu Data 8 februarie 2014 22:29:36
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<fstream>
#include<algorithm>

using namespace std;

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

int a[100000],t[400000];

void build(int v, int l , int r ){

    if(l == r){
        t[v]=a[l];
    }
    else{
        int m=(l+r)/2;

        build(v*2, l , m);
        build(v*2+1, m+1, r);

        t[v]=max(t[2*v], t[2*v+1]);
    }
}


void ud(int v, int l, int r, int p, int x){

    if(l == r){
        t[v]=x;
    }
    else{
        int m=(l+r)/2;
        if(p<=m){
            ud(v*2, l, m, p, x);
        }
        else
            ud(v*2+1, m+1, r, p , x);

        t[v]=max(t[2*v],t[2*v+1]);
    }
}


int mx(int v, int tl, int tr, int l, int r){
    if(l > r)
        return -1;

    if(l == tl && r == tr )
        return t[v];

    int m=(tl + tr)/2;

    return max( mx(2*v, tl , m , l , min(r,m)) , mx(2*v+1, m+1, tr, max(l, m+1), r));

}


int main(){
int n,m,i,j,x,y;

    f>>n>>m;
    for(i=1; i<=n; ++i)
        f>>a[i];

    build(1,0,n);

    for(i=0; i<m; ++i){
        f>>j>>x>>y;

        if(j){
            ud(1, 0 , n , x, y);
        }
        else

            g<<mx(1,0,n, x, y)<<'\n';
    }

return 0;
}