Pagini recente » Cod sursa (job #2180859) | Cod sursa (job #196407) | Cod sursa (job #1056241) | Cod sursa (job #2093320) | Cod sursa (job #1610590)
#include <cstdio>
#include <algorithm>
using namespace std;
int const NMAX=200002;
int poz[NMAX], ord[NMAX], h[NMAX],n;
void up(int p)
{
if(p>1 && h[p]<h[p/2])
{
swap(h[p],h[p/2]);
swap(poz[p],poz[p/2]);
swap(ord[poz[p]],ord[poz[p/2]]);
up(p/2);
}
}
void down(int p)
{
if(p*2<n)
{
if(h[p*2]<h[p*2+1] && h[p]>h[p*2])
{
swap(h[p],h[p*2]);
swap(poz[p],poz[p*2]);
swap(ord[poz[p]],ord[poz[p*2]]);
down(p*2);
}
if(h[p*2]>=h[p*2+1] && h[p]>h[p*2+1])
{
swap(h[p],h[p*2+1]);
swap(ord[p],ord[p*2+1]);
swap(poz[ord[p]],poz[ord[p*2+1]]);
down(p*2+1);
}
}
if(p*2==n && h[p]>h[p*2])
{
swap(h[p],h[p*2]);
swap(poz[p],poz[p*2]);
swap(ord[poz[p]],ord[poz[p*2]]);
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int t,op, x,cnt=0;
scanf("%d", &t);
for(int k=1; k<=t; k++)
{
scanf("%d", &op);
if(op == 1)
{
scanf("%d", &x);
h[++n]=x;
++cnt;
poz[n]=cnt;
ord[cnt]=n;
up(n);
}
if(op == 2)
{
scanf("%d", &x);
int i=ord[x];
swap(h[i],h[n]);
swap(poz[i],poz[n]);
swap(ord[poz[i]], ord[poz[n]]);
n--;
down(i);
}
if(op == 3)
{
printf("%d\n", h[1]);
}
}
return 0;
}