Cod sursa(job #2001080)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 15 iulie 2017 17:21:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int INF = 1e9 + 1 , DIM = 100001;
int n,q,i,t,x,y,aint[4*DIM],elements[DIM];
void build( int nod,int st, int dr){
    if( st == dr ){
        aint[nod] = elements[st];
        return;
    }
    int mid = ( st + dr )/2;
    build( 2*nod, st, mid );
    build( 2*nod + 1, mid+1, dr );
    aint[nod] = max( aint[nod*2] , aint[nod*2+1] );
    return;
}
void update( int nod,int st, int dr,int x, int p ){
    if( dr < p || st > p ){
        return;
    }
    if( st == dr ){
        aint[nod] = x;
        return;
    }
    int mid = (st + dr) /2;
    update( nod*2, st,mid,x,p );
    update( nod*2 + 1, mid+1,dr,x,p );
    aint[nod] = max( aint[nod*2],aint[nod*2+1] );
    return;
}
int query( int nod, int  st,int dr, int x, int y ){
    if( dr < x || st > y ){
        return -INF;
    }
    if(x <= st && dr <= y){
        return aint[nod];
    }
    int mid = ( st + dr )/2;
    int stanga = query( nod *2,st,mid,x,y);
    int dreapta = query( nod*2+1,mid+1,dr,x,y);
    return max( stanga, dreapta );
}
int main(){
    in >> n >> q;
    for( i = 1; i <= n; i ++ ){
        in >> elements[i];
    }
    build( 1,1,n );
    for( i = 1; i <= q; i ++ ){
        in >> t >> x >> y;
        if( t == 1 ){
            update( 1,1,n,y,x );
        }
        else{
            out<<query( 1,1,n,x,y )<<"\n";
        }
    }
    return 0;
}