Pagini recente » Cod sursa (job #11958) | Cod sursa (job #1218777) | Cod sursa (job #392119) | Cod sursa (job #2092235) | Cod sursa (job #1459355)
// 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;
}