Pagini recente » Borderou de evaluare (job #2747089) | Autentificare | Cod sursa (job #584645) | Cod sursa (job #1810029) | Cod sursa (job #822425)
Cod sursa(job #822425)
#include <cstdio>
#include <cstdlib>
#define nmax 200221
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
int v[nmax],poz[nmax],intr[nmax];
int k=0;
void swap(int &a,int &b)
{
int aux;
aux=a;
a=b;
b=aux;
aux=poz[a];
poz[a]=poz[b];
poz[b]=aux;}
void up_heap(int k)
{
if ( (k==1) || (v[k]>=v[k/2]) )
return;
else
if (v[k]<v[k/2])
{
swap(v[k],v[k/2]);
up_heap(k/2);}
}
void down_heap(int a)
{
int min;
if ((2*a)<=k)
{
min=2*a;
if ((2*a+1)<=k)
if (v[min]>v[2*a+1])
min=2*a+1;
swap(v[min],v[a]);
down_heap(min);
}
else
return;
}
int main()
{
int n,tip,x;
fscanf(f,"%d",&n);
while (n>0)
{
fscanf(f,"%d",&tip);
if (tip==1)
{
fscanf(f,"%d",&x);
k++;
v[k]=x;intr[k]=x;
poz[x]=k;
up_heap(k);}
else
if (tip==2)
{
fscanf(f,"%d",&x);
int q=poz[intr[x]];
swap(v[q],v[k]);
k--;
down_heap(q);}
else
fprintf(g,"%d \n",v[1]);
n--;
}
return 0;
}