Cod sursa(job #2702990)

Utilizator mihnea.anghelMihnea Anghel mihnea.anghel Data 6 februarie 2021 15:08:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define f in
#define g out

using namespace std;
ifstream in ( "arbint.in" );
ofstream out( "arbint.out" );
int aint[400000];
int n, m, i, maxim, op, x, y;

void build ( int nod, int  st, int dr ){
    if ( st == dr )
        f>>aint[nod];
    else {
        int mid = (st+dr)/2;
        build(2*nod, st, mid);
        build(2*nod+1, mid+1, dr);
        aint[nod] = max ( aint[2*nod], aint[2*nod+1] );
    }
}

void update ( int nod, int st, int dr, int poz, int nr ){
   if ( st == dr )
       aint[nod] = nr;
    else {
        int mid = (st+dr)/2;
        if ( poz <= mid )
            update(2*nod, st, mid, poz, nr);
        else update(2*nod+1, mid+1, dr, poz, nr);
        aint[nod] = max ( aint[2*nod], aint[2*nod+1] );
    }
}

void query ( int nod, int st, int dr, int x, int y ){
    if ( x <= st && dr <= y )
        maxim = max ( maxim, aint[nod] );
    else {
        int mid = (st+dr)/2;
        if ( x <= mid )
            query(2*nod, st, mid, x, y);
        if ( y > mid )
            query(2*nod+1, mid+1, dr, x, y);
    }
}

int main() {
    f>>n>>m;
    build(1, 1, n);
    for ( ; m--; ){
        f>>op>>x>>y;
        if ( !op ){
            maxim = 0;
            query(1,1,n,x,y);
            g<<maxim<<"\n";
        } else update(1,1,n,x,y);
    }
    return 0;
}