Cod sursa(job #1424638)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 25 aprilie 2015 10:19:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<stdio.h>
#define DIM 300000
FILE *f=fopen("arbint.in","r"), *g=fopen("arbint.out","w");


int N, M, Arb[DIM], a, b;

int Maxim( int Q, int W ){ if( Q > W ) return Q; return W; }

void Update( int poz, int val ){
int i, j, st, dr, mij, pozArb, Max;

    st = 1; dr = N; pozArb = 1;

    while( st != dr ){

        mij = ( st + dr ) / 2;

        if( poz <= mij ){

            dr = mij;
            pozArb = pozArb * 2;

        }

        else{

            st = mij + 1;
            pozArb = pozArb * 2 + 1;

        }

    }

    Arb[ pozArb ] = val;

    pozArb /= 2;

    while( pozArb >= 1 ){

        Arb[ pozArb ] = Maxim( Arb[ pozArb * 2 ], Arb[ pozArb * 2 + 1 ] );

        pozArb /= 2;
    }

}

int Query( int k1, int k2, int pozArb ){  // [a,b] - cel citit, [k1,k2] - cel momentan
int mij, R1 = 0, R2 = 0;

    if( a <= k1 && k2 <= b )   // E inclus
        return Arb[ pozArb ];

    mij = ( k1 + k2 ) / 2;

    if( a <= mij )  // Ma duc in stanga
        R1 = Query( k1, mij, pozArb * 2 );

    if( b >= mij+1 ) // Ma duc in dreapta
        R2 = Query( mij+1, k2, pozArb * 2 + 1 );

    return Maxim( R1, R2 );

}

void Citire(){
int i, x;

    fscanf(f,"%d %d\n",&N,&M);

    for(i=1;i<=N;i++){
        fscanf(f,"%d",&x);
        Update(i,x);
    }

    for(i=1;i<=M;i++){

        fscanf(f,"%d %d %d\n",&x,&a,&b);

        if( x == 0 )
            fprintf(g,"%d\n", Query( 1, N, 1 ) );

        else
            Update( a, b );

    }

}

int main(){

    Citire();

return 0;
}