Cod sursa(job #1772964)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 7 octombrie 2016 12:25:11
Problema Arbori de intervale Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>
#define nmax 100000
FILE *fin, *fout;
int v[nmax], aint[131072], n, a, b, max;

int maxim( int a, int b ){
    return (a >= b ) ? a : b;
}

void generare( int poz, int st, int dr ){
    if( st==dr )
        aint[poz] = v[st];
    else{
        int mij = ( st + dr ) / 2;
        generare( poz*2, st, mij );
        generare( poz*2+1, mij+1, dr );
        aint[poz] = maxim( aint[poz*2], aint[poz*2+1] );
    }
}

void cauta( int poz, int st, int dr ){
    if( st>=a && dr<=b )
        max = maxim( max, aint[poz] );
    else{
        int mij = ( st + dr ) / 2;
        if( mij>=a ){
            cauta( poz*2, st, mij );
    //        max = maxim( max, aint[poz*2] );
        }
        if( mij<b ){
            cauta( poz*2+1, mij+1, dr );
       //     max = maxim( max, aint[poz*2+1] );
        }
    }
}

void update( int poz, int st, int dr ){
    if( st==dr )
        aint[poz] = b;
    else{
        int mij = ( st + dr ) / 2;
        if( mij >= a ){
            update( poz*2, st, mij );
            aint[poz] = maxim( aint[poz*2], aint[poz*2+1] );
        }
        else{
            update( poz*2+1, mij+1, dr );
            aint[poz] = maxim( aint[poz*2], aint[poz*2+1] );
        }
    }
}

int main()
{
    int m, i, ver;
    fin = fopen( "arbint.in", "r" );
    fout = fopen( "arbint.out", "w" );
    fscanf( fin, "%d%d", &n, &m );
    for( i=1; i<=n; i++ )
        fscanf( fin, "%d", &v[i] );
    generare( 1, 1, n );
    for( i=0; i<m; i++ ){
        fscanf( fin, "%d%d%d", &ver, &a, &b );
        if( ver==0 ){
            max = 0;
            cauta( 1, 1, n );
            fprintf( fout, "%d\n", max );
        }
        else{
            update( 1, 1, n );
        }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}