Pagini recente » Cod sursa (job #1643015) | Cod sursa (job #1515267) | Cod sursa (job #796381) | Cod sursa (job #389132) | Cod sursa (job #1256461)
#include<stdio.h>
int n,heap[200000],v[200000],poz[200000];
inline int fiudr(int a)
{
return (a*2)+2;
}
inline int fiust(int a)
{
return (a*2)+1;
}
inline int tata(int a)
{
return (a-1)/2;
}
inline void swap(int p1,int p2)
{
int aux;
poz[heap[p1]]=p2;
poz[heap[p2]]=p1;
aux=heap[p1];
heap[p1]=heap[p2];
heap[p2]=aux;
}
inline void urcare(int p)
{
while((p!=0) && (v[heap[p]]<v[heap[tata(p)]]))
{
swap(p,tata(p));
p=tata(p);
}
}
inline void coborare(int p)
{
int f,q;
f=1;
while((f==1) && (fiust(p)<n))
{
q=fiust(p);
if((fiudr(p)<n) && (v[heap[fiudr(p)]]<v[heap[q]]))
{
q=fiudr(p);
}
if(v[heap[q]]<v[heap[p]])
{
swap(p, q);
p=q;
}
else
{
f=0;
}
}
}
inline void sterge(int p)
{
n--;
heap[poz[p]]=heap[n];
poz[heap[n]]=poz[p];
if((poz[p]!=0) && (v[heap[poz[p]]]<v[heap[tata(poz[p])]]))
{
urcare(poz[p]);
}
else
{
coborare(poz[p]);
}
}
inline void adauga(int p)
{
heap[n]=p;
poz[p]=n;
n++;
urcare(poz[p]);
}
int main()
{
int t,i,q,x,k;
FILE *fin=fopen("heapuri.in" ,"r");
FILE *fout=fopen("heapuri.out", "w");
fscanf(fin,"%d",&t);
n=0;
k=0;
for(i=0;i<t;i++)
{
fscanf(fin,"%d",&q);
if(q==3)
{
fprintf(fout, "%d\n", v[heap[0]]);
}
else
{
fscanf(fin,"%d",&x);
if(q==2)
{
sterge(x-1);
}
else
{
v[k]=x;
adauga(k);
k++;
}
}
}
fclose(fin);
fclose(fout);
return 0;
}