Pagini recente » Cod sursa (job #1802678) | Cod sursa (job #3223405) | Cod sursa (job #1705587) | Cod sursa (job #351157) | Cod sursa (job #2902173)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
struct Nod {
int val;
Nod *st, *dr;
};
int v[100000], n, m;
Nod* build( int st, int dr )
{
Nod *nou = new Nod;
if( st == dr )
{
nou->val = v[st];
nou->st = NULL;
nou->dr = NULL;
return nou;
}
nou->st = build( st, ( st + dr ) / 2 );
nou->dr = build( ( st + dr ) / 2 + 1, dr );
nou->val = max( nou->st->val, nou->dr->val );
return nou;
}
void afisareRSD( Nod* n )
{
if( n != NULL )
{
cout << n->val << " ";
afisareRSD( n->st );
afisareRSD( n->dr );
}
}
int interogare( Nod* nod, int st, int dr, int a, int b )
{
if( a <= st && dr <= b )
return nod->val;
int maxSt = 0, maxDr = 0;
int mij = ( st + dr ) / 2;
if( a <= mij )
maxSt = interogare( nod->st, st, mij, a, b );
if( b > mij )
maxDr = interogare( nod->dr, mij + 1, dr, a, b );
return max( maxSt, maxDr );
}
void actualizare( Nod* nod, int st, int dr, int poz )
{
if( st == dr )
{
nod->val = v[st];
return;
}
int mij = ( st + dr ) / 2;
if( st <= poz && poz <= mij )
actualizare( nod->st, st, mij, poz );
if( mij + 1 <= poz && poz <= dr )
actualizare( nod->dr, mij + 1, dr, poz );
nod->val = max( nod->st->val, nod->dr->val );
}
int main()
{
f >> n >> m;
for( int i = 0; i < n; ++i )
f >> v[i];
Nod *rad = build( 0, n - 1 );
for( int i = 0; i < m; ++i )
{
int x, a, b;
f >> x >> a >> b;
if( x == 0 )
g << interogare( rad, 0, n - 1, a - 1, b - 1 ) << "\n";
else
{
v[a - 1] = b;
actualizare( rad, 0, n - 1, a - 1 );
}
}
f.close();
g.close();
return 0;
}