Pagini recente » Cod sursa (job #367235) | Cod sursa (job #533626) | Cod sursa (job #2107666) | Cod sursa (job #134368) | Cod sursa (job #3163337)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 200000
int v[4*nmax], ord[4*nmax], loc[2*nmax];
int m;
void swapp( int x, int y ) {
int aux;
aux = v[x];
v[x] = v[y];
v[y] = aux;
aux = ord[x];
ord[x] = ord[y];
ord[y] = aux;
aux = loc[ord[x]];
loc[ord[x]] = loc[ord[y]];
loc[ord[y]] = aux;
}
void update_sus( int poz ) {
while( poz > 1 ) {
if( v[poz/2] > v[poz] ) {
swapp( poz/2, poz );
}
poz = poz / 2;
}
}
void update_jos( int poz ) {
int child;
while( poz*2 <= m ) {
child = poz * 2;
if( child + 1 <= m && v[child+1] < v[child] )
child++;
if( v[child] < v[poz] ) {
swapp( child, poz );
poz = child;
} else break;
}
}
int main() {
int n, i, x, t, j, nr_inserate = 0;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
cin >> n;
m = 0;
for( i = 1; i <= n; i++ ) {
cin >> t;
if( t == 1 ) {
cin >> x;
m++;
nr_inserate++;
v[m] = x;
ord[m] = nr_inserate;
loc[nr_inserate] = m;
update_sus( m );
} else if( t == 2 ) {
cin >> x;
x = loc[x];
if( x == m ) {
m--;
} else {
swapp( x, m );
m--;
update_jos( x );
update_sus( x );
}
} else {
cout << v[1] << "\n";
}
//cout << "\n" << "testul " << i << "\n";
//for( j = 1; j <= m; j++ )
//cout << v[j] << " " << ord[j] << " __ ";
//cout << "\n";
}
return 0;
}