Cod sursa(job #1921009)

Utilizator din99danyMatei Daniel din99dany Data 10 martie 2017 11:02:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <iostream>
using namespace std;

#define NMAX 100005

int Aint[ NMAX * 5 ];

void Update ( int st, int dr, int poz, int val, int nod );
int Querry ( int st, int dr, int poz, int start, int finish );

int main () {

    freopen( "arbint.in", "r", stdin );
    freopen( "arbint.out", "w", stdout );

    int n, m, i, j, x, y, c;

    scanf( "%d%d",&n,&m );
    for ( i = 1; i <= n; ++i ) {
        scanf( "%d",&x );
        Update( 1, n, 1, x, i );

    }

    while ( m-- ) {
        scanf( "%d%d%d",&c,&x,&y );
        if ( c == 1 ) {
            Update( 1, n, 1, y, x );
        } else {
            printf( "%d\n",Querry( 1, n, 1, x, y ) );
        }

    }

    return 0;

}


void Update ( int st, int dr, int poz, int val, int nod ) {

    if ( st == dr ) {
        Aint[ poz ] = val;
        return ;
    }

    int mid = ( st + dr ) / 2;

    if ( nod <= mid ) Update( st, mid, poz * 2, val, nod );
    else Update( mid + 1, dr, poz * 2 + 1, val, nod );

    Aint[ poz ] = max ( Aint[ poz * 2 ], Aint[ poz * 2 + 1 ] );

}

int Querry ( int st, int dr, int poz, int start, int finish ) {

    if ( start <= st && dr <= finish ) {
        return Aint[ poz ];
    }

    int mid = ( st + dr ) / 2;
    int a, b;   a = b = -1;

    if ( start <= mid ) a = Querry( st, mid, poz * 2, start, finish );
    if ( mid < finish ) b = Querry( mid + 1, dr, poz * 2 + 1, start, finish );

    return max ( a, b );

}