Cod sursa(job #1626352)

Utilizator IgorDodonIgor Dodon IgorDodon Data 3 martie 2016 01:52:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
#include<algorithm>
#define DIM 100005
FILE *f=fopen("arbint.in","r"), *g=fopen("arbint.out","w");

using namespace std;

int N, Q, Arb[3*DIM], x, tip, A, B;

void Update( int poz, int val ){
int mij, i, k1, k2;

    k1 = 1;
    k2 = N;
    i  = 1; // poz in Arb

    while( k1 < k2 ){

        mij = ( k1 + k2 ) / 2;

        if( poz <= mij ){
            i  = i * 2;
            k2 = mij;
        }
        else{
            i  = i * 2 + 1;
            k1 = mij + 1;
        }

    }   if( k1 != k2 ) printf("EROARE FATALA!!");

    Arb[i] = val;

    while( i > 1 ){

        Arb[i/2] = max( Arb[(i/2)*2], Arb[(i/2)*2+1] );
        i /= 2;

    }

}

int Query( int k1, int k2, int iArb ){ // [k1,k2] intervalul momentan
int mij, ST, DR;                        // iArb = poz in Arb

    if( A <= k1 && k2 <= B )
        return Arb[iArb];

    if( !(k2 < A || k1 > B) ){

        mij = ( k1 + k2 ) / 2;

        ST = Query( k1,   mij, iArb*2 );
        DR = Query( mij+1, k2, iArb*2+1 );

        return max(ST,DR);
    }

    else
        return 0;   // Un numar care nu modifica maximul

}

int main(){

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

    for(int i=1;i<=N;i++){

        fscanf(f,"%d",&x);
        Update(i,x);

    }

    for(int q=1;q<=Q;q++){

        fscanf(f,"%d %d %d\n",&tip,&A,&B);

        if( tip == 1 )
            Update(A,B);

        else
            fprintf(g,"%d\n",Query(1,N,1));
    }

return 0;
}