Pagini recente » Cod sursa (job #1369677) | Cod sursa (job #690713) | Cod sursa (job #1841790) | Cod sursa (job #2292656) | Cod sursa (job #370975)
Cod sursa(job #370975)
#include<fstream.h>
long a[200000],v[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=a[x];
a[x]=a[y];
a[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[rs(k)]<son)son=rs(k);
if(a[son]>=a[k])son=0;
}
if(son)
{
v[a[son]]=k;
v[a[k]]=son;
ex(son,k);
k=son;
}
}
while(son);
}
void percolate(long k)
{
long key=a[k],kk=k;
while(k>1&&key<a[f(k)])
{
a[k]=a[f(k)];
v[f(k)]=k;
k=f(k);
}
a[k]=key;
v[kk]=k;
}
void bh(long n)
{
long i;
for(i=n>>1;i;i--)sift(n,i);
}
void cut(long &n, long k)
{
a[k]=a[n];
n--;
if(k>1&&a[k]<a[f(k)])percolate(k);
else sift(n,k);
}
void insert(long &n, long key)
{
a[++n]=key;
v[n]=n;
percolate(n);
}
int main()
{
long ii,n,nn,i,op,x,el;
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,v[el]);
}
else if(op==3) g<<a[1]<<'\n';
}
return 0;
}