Pagini recente » Cod sursa (job #1644490) | Cod sursa (job #2631020) | Cod sursa (job #2206838) | Cod sursa (job #208212) | Cod sursa (job #1082139)
#include <cstdio>
#include <algorithm>
using namespace std;
int my_heap[200000],poz_heap[200000],ordine[200000],n,nr,tip,x;
FILE *f,*g;
void schimba(int i, int j)
{
swap(poz_heap[i],my_heap[j]);
ordine[poz_heap[i]]=i;
ordine[poz_heap[j]]=j;
swap(my_heap[i],my_heap[j]);
}
void urca(int i)
{
if ((i/2)>=1)
if (my_heap[i/2]>my_heap[i])
{
schimba(i/2,i);
urca(i/2);
}
}
void coboara(int i)
{
int minim;
if ((2*i+1)<=n)
{
if (my_heap[2*i]<my_heap[i])
{
minim=my_heap[2*i];
if (my_heap[2*i+1]<minim)
{
schimba(2*i+1,i);
coboara(2*i+1);
}
else
{
schimba(2*i,i);
coboara(2*i);
}
}
}
else
if ((2*i)<=n)
if (my_heap[2*i]<my_heap[i])
{
schimba(2*i,i);
coboara(2*i);
}
}
void inserare(int x)
{
my_heap[++n]=x;
poz_heap[n]=++nr;
ordine[nr]=n;
urca(n);
}
void stergere(int x)
{
my_heap[x]=-1;
urca(ordine[x]);
ordine[poz_heap[1]]=0;
poz_heap[1]=poz_heap[n--];
ordine[poz_heap[1]]=1;
if (n>1) coboara(1);
}
void afisare()
{
fprintf(g,"%d\n",my_heap[1]);
}
int main()
{
f=fopen("heapuri.in","r");
g=fopen("heapuri.out","w");
fscanf(f,"%d",&n);
for (int i=1; i<=n; i++)
{
fscanf(f,"%d",&tip);
//printf("%d\n",tip);
if (tip==1) {
fscanf(f,"%d",&x);
inserare(x);}
if (tip==2) {
fscanf(f,"%d",&x);
stergere(x);
}
if (tip==3) afisare();
}
fclose(f);
fclose(g);
return 0;
}