Cod sursa(job #2179519)

Utilizator Athena99Anghel Anca Athena99 Data 20 martie 2018 11:53:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;

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

const int nmax= 100000;
const int pmax= 262144;

int n, m, p2;
int arb[pmax+1];

void arb_build( int x ) {
    if ( x*2<p2 ) {
        arb_build(x*2);
        arb_build(x*2+1);
    }

    arb[x]= max(arb[x*2], arb[x*2+1]);
}

void arb_update( int x, int y ) {
    arb[p2+x-1]= y;
    for ( int i= (p2+x-1)/2; i>=1; i/= 2 ) {
        arb[i]= max(arb[i*2], arb[i*2+1]);
    }
}

int arb_query( int x, int a, int b, int l, int r ) {
    if ( l<=a && b<=r ) {
        return arb[x];
    } else if ( r<a || b<l ) {
        return 0;
    } else {
        return max(arb_query(x*2, a, (a+b)/2, l, r), arb_query(x*2+1, (a+b)/2+1, b, l, r));
    }
}

int main(  ) {
    fin>>n>>m;
    for ( p2= 1; p2<n; p2*= 2 ) ;
    for ( int i= 1; i<=n; ++i ) {
        fin>>arb[p2+i-1];
    }

    arb_build(1);

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

        if ( z==0 ) {
            fout<<arb_query(1, 1, p2, x, y)<<"\n";
        } else {
            arb_update(x, y);
        }
    }

    return 0;
}