Pagini recente » Cod sursa (job #3199770) | Cod sursa (job #2654590) | Cod sursa (job #248119) | Cod sursa (job #1357913) | Cod sursa (job #2651285)
#include <iostream>
using namespace std;
int arb[200010];
int positions[200010];
int actual_numbers[200010];
int n;
void sift(int k) {
int minson = k, aux;
while (k <n && minson) {
minson = 0;
if (k * 2 <= n && actual_numbers[arb[k*2]] < actual_numbers[arb[k]])
if (k * 2 + 1 <= n)
if (actual_numbers[arb[k*2]] > actual_numbers[arb[k*2+1]])
minson = k * 2 + 1;
else
minson = k * 2;
else
minson = k * 2;
else
if (k * 2 + 1 <= n && actual_numbers[arb[k*2 + 1]] < actual_numbers[arb[k]])
minson = k * 2 + 1;
if (minson == 0)
break;
aux = arb[minson];
arb[minson] = arb[k];
arb[k] = aux;
positions[arb[k]] = k;
positions[arb[minson]] = minson;
k = minson;
}
}
void percolate(int k) {
int aux;
while(k>1) {
if (actual_numbers[arb[k/2]] > actual_numbers[arb[k]])
{
aux = arb[k/2];
arb[k/2] = arb[k];
arb[k] = aux;
positions[arb[k]] = k;
positions[arb[k/2]] = k/2;
k = k/2;
} else break;
}
}
int main() {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int m, a, b, total_number = 0;
scanf("%d", &m);
for(int i=0; i<m; ++i) {
scanf("%d", &a);
switch(a) {
case 1:
scanf("%d", &b);
++total_number;
++n;
actual_numbers[total_number] = b;
arb[n] = total_number;
positions[total_number] = n;
percolate(n);
break;
case 2:
scanf("%d", &b);
actual_numbers[b] = -1;
percolate(positions[b]);
positions[arb[1]] = -1;
arb[1] = arb[n];
positions[arb[1]] = 1;
--n;
sift(1);
break;
case 3:
printf("%d\n", actual_numbers[arb[1]]);
}
}
return 0;
}