Pagini recente » Cod sursa (job #724101) | Cod sursa (job #1544209) | Cod sursa (job #1556183) | Cod sursa (job #3173263) | Cod sursa (job #994771)
Cod sursa(job #994771)
#include<cstdio>
#include<algorithm>
using namespace std;
int a[200000],p[200000],q[200000];
void percolate(int n, int k)
{
int key = a[k];
while ((k > 1) && (key < a[k/2]))
{
a[k] = a[k/2];
swap(p[q[k]],p[q[k/2]]);
swap(q[k],q[k/2]);
k = k/2;
}
a[k] = key;
}
void sift(int n, int k)
{
int son;
do {
son = 0;
// Alege un fiu mai mare ca tatal.
if (k*2 <= n) {
son = k*2;
if (k*2+1 <= n && a[k*2] < a[k*2+1]) {
son = k*2+1;
}
if (a[son] >= a[k]) {
son = 0;
}
}
if (son)
{
swap(a[k], a[son]); // Functie STL ce interschimba H[K] cu H[son].
swap(p[q[k]],p[q[son]]);
swap(q[k],q[son]);
k = son;
}
} while (son);
}
void sterge(int k, int& n)
{
a[k]=a[n];
p[q[k]]=p[q[n]];
q[k]=q[n];
--n;
if ((k > 1) && (a[k] < a[k/2]))
{
percolate(n,k);
}
else
{
sift(n,k);
}
}
void insereaza(int key, int& n)
{
a[n] = key;
percolate(n, n);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int t,n=0,k=1,x;
scanf("%d",&t);
while(t)
{
--t;
scanf("%d",&x);
switch(x)
{
case 1:
{
scanf("%d",&x);
++n;
p[k]=n;
q[n]=k;
insereaza(x,n);
++k;
break;
}
case 2:
{
scanf("%d",&x);
sterge(p[x],n);
break;
}
default:printf("%d\n",a[1]);break;
}
}
return 0;
}