Pagini recente » Cod sursa (job #2009118) | Cod sursa (job #1258010) | Cod sursa (job #1459545) | Cod sursa (job #2255846) | Cod sursa (job #453050)
Cod sursa(job #453050)
#include<stdlib.h>
#include<cstdio>
#include<algorithm>
using namespace std;
int h[200005],n,poz[200005],ind[200005],a[200005];
int tata(int nod)
{
return nod / 2;
}
int fiust(int nod)
{
return nod * 2;
}
int fiudr(int nod)
{
return nod * 2 + 1;
}
int min()
{
return h[1];
}
void swap(int &x, int &y)
{int aux;
aux = x;
x = y;
y = aux;
}
void sift( int k)
{int son;
do
{
son = 0;
if (fiust(k) <= n)
{
son = fiust(k);
if (fiudr(k) <= n && a[h[fiust(k)]] > a[h[fiudr(k)]])
son = fiudr(k);
}
if (a[h[son]] >= a[h[k]]) son = 0;
if (son)
{
poz[h[son]] = k;
poz[h[k]] = son;
swap(h[k],h[son]);
k = son;
}
}while (son);
}
void perc( int k)
{int key;
key = h[k];
while (k > 1 && a[key] < a[h[tata(k)]])
{
h[k] = h[tata(k)];
poz[h[tata(k)]] = k;
k = tata(k);
}
h[k] = key;
poz[key] = k;
}
/*void buildheap()
{
for (int i = n / 2; i > 0; i--)
sift(i);
}
*/
void elimin( int k)
{
h[k] = h[n];
poz[h[n]] = k;
--n;
if (k > 1 && a[h[k]] < a[h[tata(k)]]) perc(k);
else sift(k);
}
int main()
{int ct;
int x,y,i,m;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
ct = 0;
scanf("%d",&m);
for (i = 1; i <= m; i++)
{
x = 0;
scanf("%d",&x);
if (x == 1) { scanf("%d",&a[++ct]);
h[++n] = ct;
poz[ct] = n;
perc(n);
}
if (x == 2) { scanf("%d",&y);
/*for (i = 1; i <= n; i++)
if (h[i] == a[y]) {poz = i;break;}*/
elimin(poz[y]);
}
if (x == 3) printf("%d\n",a[min()]);
}
return 0;
}