Cod sursa(job #1459355)

Utilizator petru.cehanCehan Petru petru.cehan Data 9 iulie 2015 17:26:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
// Arbori de Intervale = arbori binari ecilibrati  ,, 2 operatii de baza ( Actualizare si Interogare )
// In acest caz Actualizarea se face asupra unui element si Interogarea asupra unui Interval ( se poate si invers )


#include <iostream>
#include <fstream>

#define maxim(a,b) ( ((a) > (b)) ? (a) : (b) )

using namespace std;

ifstream fin ("arbint.in") ;
ofstream fout ("arbint.out") ;


int M , N , arb [ 2 << 19 ] ;  // Iau asa de mare vectorul incat pentru N = 100000  , 2^19 >= 2N - 1
// altfel trebuie facute teste in legatura cu existenta fiilor , arborele de intervale nefiind complet

int pos , val , val_maxim ;
int a , b ; // capete interval

void Actualizare ( int nod , int left , int right )
{
     if ( left == right )  // arb retine inf despre un interval elementar
     {
          arb [ nod ] = val ;  // modificare valoare
          return ;
     }

     int mij = ( left + right ) >> 1 ;

     if ( pos <= mij )
         Actualizare ( nod << 1 , left , mij ) ; // actualizare fiu stang

     else
         Actualizare ( ( nod << 1 ) + 1 , mij + 1 , right ) ; // actualizare fiu drept

     arb [ nod ] = maxim ( arb [ nod << 1 ] , arb [ ( nod << 1 ) + 1 ] ) ; // modificare valoare
}

void Interogare ( int nod , int left , int right )
{
     if ( a <= left && right <= b )  // verific daca intervalul ( left , right ) este inclus in (a,b)
     {
          val_maxim = maxim ( arb [ nod ] , val_maxim ) ;
          return;
     }

     int mij = ( left + right ) >> 1 ;
     if ( a <= mij )
            Interogare ( ( nod << 1 ) , left , mij ) ;

     if ( mij < b )
            Interogare ( ( nod << 1 ) + 1 , mij + 1 , right ) ;
}

void Citire ()
{
    fin >> N >> M ;
    for ( int i = 1 ; i <= N ; ++ i )
            fin >> val , pos = i , Actualizare ( 1 , 1 , N ) ;

    int op ;
    while ( M >= 1 )
    {
        fin >> op >> a >> b ;

        switch (op)
        {
            case 0 : val_maxim = -1 ; Interogare ( 1 , 1 , N ) ; fout << val_maxim << "\n" ; break ;
            case 1 : pos = a , val = b , Actualizare ( 1 , 1 , N ) ; break ;
        }

        -- M ;
    }
}
int main()
{
    Citire () ;
    return 0;
}