Cod sursa(job #1122318)

Utilizator Athena99Anghel Anca Athena99 Data 25 februarie 2014 17:31:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <algorithm>
#include <fstream>

using namespace std;

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

const int nmax= 262144; //smallest x such as x>given nmax and x power of two

int v[nmax+1];

inline int query( int x, int l, int r, int a, int b ) {
    if ( a<=l && b>=r ) {
        return v[x];
    } else if ( a<=r && b>=l ) {
        int sol1= query(2*x, l, (l+r)/2, a, b), sol2= query(2*x+1, (l+r)/2+1, r, a, b);
        return max(sol1, sol2);
    }
    return 0;
}

void update( int step, int y, int z ) {
    v[step+y-1]= z;
    for ( int i= (step+y-1)/2; i>=1; i/= 2 ) {
        v[i]= max(v[2*i], v[2*i+1]);
    }
}

int main(  ) {
    int n, m, step;
    fin>>n>>m;
    
    for ( step= 1; step<n; step*= 2 ) ;
    for ( int i= 1; i<=n; ++i ) {
        fin>>v[step+i-1];
    }
    for ( int i= step-1; i>=1; --i ) {
        v[i]= max(v[2*i], v[2*i+1]);
    }

    for ( int i= 1; i<=m; ++i ) {
        int x, y, z;
        fin>>x>>y>>z;

        if ( x==0 ) {
            fout<<query( 1, 1, step, y, z )<<"\n";
        } else {
            update(step, y, z);
        }
    }

    return 0;
}