Pagini recente » Cod sursa (job #655551) | Cod sursa (job #76886) | Cod sursa (job #119408) | Cod sursa (job #1231576) | Cod sursa (job #3250584)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 200001
int elemArb = 0;
struct info{
int val, x;
};
info arb[4 * nmax];
int v[nmax];
void update( int vf ) {
v[arb[vf].x] = vf;
}
void push_jos( int vf ) {
int fiu;
if( 2 * vf > elemArb )
return;
if( 2 * vf + 1 > elemArb || arb[2 * vf].val < arb[2 * vf + 1].val )
fiu = 2 * vf;
else
fiu = 2 * vf + 1;
if( arb[fiu].val < arb[vf].val ) {
swap( arb[fiu], arb[vf] );
update( vf );
update( fiu );
push_jos( fiu );
}
}
void push_sus( int vf ) {
int tata;
tata = vf / 2;
if( tata == 0 )
return;
if( arb[tata].val > arb[vf].val ) {
swap( arb[tata], arb[vf] );
update( vf );
update( tata );
push_sus( tata );
}
}
int main() {
int nr, t, x, nrAdaugate = 0, vf;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
cin >> nr;
for( int w = 0; w < nr; w++ ) {
cin >> t;
if( t == 1 ) {
cin >> x;
v[++nrAdaugate] = ++elemArb;
arb[elemArb].val = x;
arb[elemArb].x = nrAdaugate;
push_sus( elemArb );
} else if( t == 2 ) {
cin >> x;
vf = v[x];
swap( arb[vf], arb[elemArb] );
update( vf );
elemArb--;
push_sus( vf );
push_jos( vf );
} else{
cout << arb[1].val << "\n";
}
}
return 0;
}