Pagini recente » Cod sursa (job #710908) | Cod sursa (job #272027) | Cod sursa (job #247133) | Cod sursa (job #2859414) | Cod sursa (job #395424)
Cod sursa(job #395424)
#include <cstdio>
using namespace std;
const int NMAX=200006;
int H[NMAX],A[NMAX],poz[NMAX];
int lg;
void sift(int x)
{ int fiu;
do
{
fiu=x<<1;
if (fiu<=lg)
{
if (fiu+1<=lg && A[H[fiu+1]]<A[H[fiu]]) fiu++;
if (A[H[fiu]]<A[H[x]])
{
int aux=poz[H[fiu]]; poz[H[fiu]]=poz[H[x]]; poz[H[x]]=aux;
aux=H[fiu]; H[fiu]=H[x]; H[x]=aux;
x=fiu;
}
else fiu=0;
}
else fiu=0;
}
while (fiu);
}
void percolate(int x)
{
int val=H[x];
while (x>1 && (A[val]<A[H[(x>>1)]]))
{
H[x]=H[x>>1]; poz[H[x]]=x;
x>>=1;
}
H[x]=val; poz[val]=x;
}
int main()
{
FILE *fin=fopen("heapuri.in","r");
FILE *fout=fopen("heapuri.out","w");
int t,N,x,op,nad;
fscanf(fin,"%d",&N);
lg=0; nad=0;
for (t=1;t<=N;++t)
{
fscanf(fin,"%d",&op);
switch (op)
{
case 1:{
fscanf(fin,"%d",&x);
H[++lg]=++nad; A[nad]=x; poz[nad]=lg;
percolate(lg);
break;
}
case 2:{
fscanf(fin,"%d",&x);
H[poz[x]]=H[lg]; poz[H[lg]]=poz[x]; lg--;
if (poz[x]>1 && A[H[poz[x]]]<A[H[poz[x]>>1]]) percolate(poz[x]);
else sift(poz[x]);
break;
}
case 3:{
fprintf(fout,"%d\n",A[H[1]]);
}
}
}
fclose(fin); fclose(fout);
return 0;
}