Cod sursa(job #847234)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 3 ianuarie 2013 16:52:51
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>

int N , M ;
int arb[20000000] , op , a , b , aux ;

int max ( int a , int b )
{

    if ( a < b ) return b;
        else return a ;

}

void update ( int nod , int stanga , int dreapta )
{
    if ( stanga == dreapta ) arb[nod] = b;
        else
        {
            int mid = ( stanga + dreapta )/2 ;
            if ( a <= mid )  update ( 2*nod , stanga , mid );
                else update ( 2*nod + 1 , mid + 1 , dreapta );
            arb[nod] = max ( arb[2*nod] , arb[2*nod + 1 ] );
        }
}

void query ( int nod , int stanga , int dreapta )
{
    if ( a <= stanga && dreapta <= b )
        aux = max ( aux , arb[nod] );
        else
        {
            int mid = ( stanga + dreapta  ) / 2;
            if ( a <= mid  )    query ( 2*nod , stanga , mid );
            if ( mid < b )     query ( 2*nod + 1 , mid + 1 , dreapta );
        }
}

int main ()
{
    FILE *fin , *fout ;
    fin = fopen ( "arbint.in" , "rt" );
    fout = fopen ( "arbint.out" , "wt" );

    fscanf ( fin , "%d %d " , &N , &M );

    for ( int i = 1 ; i <= N ; i++ )
    {
        fscanf ( fin , "%d" , &b );
        a = i ;
        update ( 1 , 1 , N );
    }

    for ( int i = 1 ; i <= M ; i++ )
    {
        fscanf ( fin , "%d %d %d " , &op , &a , &b );

        if ( !op )
        {
            aux = 0;
            query ( 1 , 1 , N );
            fprintf ( fout , "%d\n" , aux );
            printf ( "%d\n" , aux );
        }
            else    update ( 1 , 1 , N );
    }






    fclose ( fin );
    fclose ( fout );

    return 0 ;
}