Cod sursa(job #1103797)

Utilizator lilian_ciobanuLilian Ciobanu lilian_ciobanu Data 9 februarie 2014 22:42:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream>
#include<algorithm>

using namespace std;

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

int a[100050],t[400200];

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

    if(l == r){
        t[v]=a[l];
    }
    else{
        int d=v<<1;
        int m=(l+r)>>1;

        build(d, l , m);
        build(d+1, m+1, r);

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


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

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

        t[v]=max(t[d],t[d+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)>>1;
    int d=v<<1;
    return max( mx(d, tl , m , l , min(r,m)) , mx(d+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;
}