Pagini recente » Cod sursa (job #1796403) | Cod sursa (job #321684) | Cod sursa (job #161246) | Cod sursa (job #2836414) | Cod sursa (job #371017)
Cod sursa(job #371017)
#include<fstream.h>
long a[200000],v[200000],m,h[200000];
long ls(long k)
{
return (k<<1);
}
long rs(long k)
{
return ((k<<1)+1);
}
long f(long k)
{
return (k>>1);
}
void ex(long x, long y)
{
long aux;
aux=h[x];
h[x]=h[y];
h[y]=aux;
}
void sift(long n, long k)
{
long son;
do
{
son=0;
if(ls(k)<=n)
{
son=ls(k);
if(rs(k)<=n&&a[h[rs(k)]]<a[h[son]])son=rs(k);
if(a[h[son]]>=a[h[k]])son=0;
}
if(son)
{
v[h[son]]=k;
v[h[k]]=son;
ex(son,k);
k=son;
}
}
while(son);
}
void percolate(long k)
{
long key=a[h[k]],kk=h[k];
while(k>1&&key<a[h[f(k)]])
{
h[k]=h[f(k)];
v[h[f(k)]]=k;
k=f(k);
}
h[k]=kk;
v[kk]=k;
}
void bh(long n)
{
long i;
for(i=n>>1;i;i--)sift(n,i);
}
void cut(long &n, long k)
{
int kk=k;
h[v[k]]=h[n];
n--;
k=v[k];
if(k>1&&a[h[k]]<a[h[f(k)]])percolate(k);
else sift(n,k);
v[kk]=0;
}
void insert(long &n, long key)
{
n++;
v[++m]=n;
a[m]=key;
h[n]=m;
percolate(n);
}
int main()
{
long n,nn,i,op,x,el,j;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>nn;
n=0;
for(i=1;i<=nn;i++)
{
f>>op;
if(op==1)
{
f>>x;
insert(n,x);
}
else if(op==2)
{
f>>el;
cut(n,el);
}
else if(op==3) g<<a[h[1]]<<'\n';
}
return 0;
}