Pagini recente » Cod sursa (job #2234455) | Cod sursa (job #1425156) | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #1227754)
#include <cstdio>
#include <algorithm>
using namespace std;
struct ostrucura
{
int x,poz;
}v[200010];
int h[400010],n,nr,nrheap,i,x;
void downheap(int nod)
{
int st,dr;
while(nod*2<=nrheap)
{
st=nod*2;
if(st<nrheap) dr=st+1;
else dr=0;
if(v[h[nod]].x>v[h[st]].x || v[h[nod]].x>v[h[dr]].x)
if(v[h[st]].x<v[h[dr]].x)
{
swap(h[nod],h[st]);
swap(v[h[nod]].poz,v[h[st]].poz);
nod=st;
}
else
{
swap(h[nod],h[dr]);
swap(v[h[nod]].poz,v[h[dr]].poz);
nod=dr;
}
else break;
}
}
void upheap(int nod)
{
int t;
while(nod>1)
{
t=nod/2;
if(v[h[t]].x>v[h[nod]].x)
{
swap(h[t],h[nod]);
swap(v[h[t]].poz,v[h[nod]].poz);
nod=t;
}
else break;
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d",&n);
v[0].x=1000000010;
for(;n;n--)
{
scanf("%d",&x);
if(x==1)
{
scanf("%d",&x);
v[++nr].x=x;
h[++nrheap]=nr;
v[nr].poz=nrheap;
upheap(nrheap);
}
else if(x==2)
{
scanf("%d",&x);
h[v[x].poz]=h[nrheap];
v[h[nrheap]].poz=v[x].poz;
nrheap--;
downheap(v[x].poz);
}
else
{
printf("%d\n",v[h[1]].x);
}
}
return 0;
}