Pagini recente » Cod sursa (job #1935519) | Cod sursa (job #2141851) | Cod sursa (job #1936853) | Cod sursa (job #683624) | Cod sursa (job #283540)
Cod sursa(job #283540)
#include <fstream.h>
#define nmax 200005
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
long h[nmax],poz[nmax],n,nr;
long val[nmax];
int sift(int k)
{int son;
do{son=0;
if (2*k<=n)
{son=2*k;
if (son+1<=n && val[h[son+1]]<val[h[son]]) son++;
}
if (val[h[k]]<=val[h[son]]) son=0;
else
if (son>0)
{long aux=h[k];
h[k]=h[son];
h[son]=aux;
poz[h[k]]=k;
poz[h[son]]=son;
k=son;
}
}while (son);
return k;
}
void percolate(long k)
{long aux;
while (k>1 && val[h[k/2]]>val[h[k]])
{aux=h[k/2];
h[k/2]=h[k];
h[k]=aux;
poz[h[k/2]]=k/2;
poz[h[k]]=k;
k=k/2;
}
}
void insert(long x)
{n++;
nr++;
val[nr]=x;
h[n]=nr;
poz[nr]=n;
percolate(n);
}
void cut(long k)
{h[k]=h[n];
--n;
if (k>1 && h[k]<h[k/2])
percolate(k);
else sift(k);
}
int main()
{long x,m,key;
fin>>m;
for (long i=1;i<=m;i++)
{fin>>key;
if (key==1)
{fin>>x;
insert(x);}
if (key==2)
{fin>>x;
cut(poz[x]);
poz[x]=0;
}
if (key==3) fout<<val[h[1]]<<'\n';
}
fout.close();
return 0;
}