Pagini recente » Cod sursa (job #1840789) | Cod sursa (job #940860) | Cod sursa (job #2883086) | Cod sursa (job #321228) | Cod sursa (job #2502931)
#include <iostream>
#include <fstream>
using namespace std;
ifstream x("heapuri.in");
ofstream y("heapuri.out");
int n,i,nr,h[200202],j,o,nod,pozi[200202],ordine[200202];
void percolate(int h[200202], int n, int k)
{
int key=h[k],p=ordine[k];
while(k>1 && key<h[k/2])
{
pozi[ordine[k/2]]=k;
h[k]=h[k/2];
ordine[k]=ordine[k/2];
k=k/2;
}
h[k]=key;
ordine[k]=p;
pozi[p]=k;
}
void sift(int h[200002],int n, int k)
{
int son,key=h[k],poz=ordine[k];
do
{
son=0;
if(k*2<=n)
{
son=k*2;
if(k*2+1<=n && h[k*2+1]<h[k*2])
son=k*2+1;
}
if(son<=n && son && key>h[son])
{
pozi[ordine[son]]=k;
h[k]=h[son];
ordine[k]=ordine[son];
k=son;
}
else
son=0;
}while(son);
h[k]=key;
ordine[k]=poz;
pozi[poz]=k;
}
void insert_heap(int nod)
{
h[++n]=nod;
j++;
pozi[j]=n;
ordine[n]=j;
percolate(h,n,n);
}
void cut(int h[200002],int &n ,int k)
{
h[pozi[k]]=h[n];
pozi[ordine[n]]=pozi[k];
ordine[pozi[k]]=ordine[n];
n--;
percolate(h,n,pozi[k]);
sift(h,n,pozi[k]);
}
int main()
{
x>>nr;
for(i=1;i<=nr;i++)
{
x>>o;
if(o==1)
{
x>>nod;
insert_heap(nod);
}
else
{
if(o==2)
{
x>>nod;
cut(h,n,nod);
}
else
y<<h[1]<<'\n';
}
}
x.close();
y.close();
return 0;
}