Cod sursa(job #235873)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 26 decembrie 2008 11:03:54
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>

int A[200001],nr,ord[200001],cont;
bool use[200001];

void down(int x)
{
int aux,ok=1,r;
while (ok)
{
ok=0;
if (2*x<=nr) r = 2*x;
if (2*x+1<=nr) if (A[2*x+1]<A[r]) r++;
if (A[r]<A[x]) ok=1;
if (ok)
{
aux = A[r];
A[r] = A[x];
A[x] = aux;
aux = ord[r];
ord[r] = ord[x];
ord[x] = aux;
x=r;
}
}
}
void up(int x)
{
int aux;
while (A[x/2]>A[x] && x!=1)
{
aux = A[x];
A[x] = A[x/2];
A[x/2] = aux;
aux = ord[x/2];
ord[x/2] = ord[x];
ord[x] = aux;
x=x/2;
}
}
void add(int x)
{
nr++;
cont++;
A[nr] = x;
ord[nr] = cont;
up(nr);
}
void del(int x)
{
A[1] = A[nr];
ord[1] = ord[nr];
nr--;
down(1);
}

int main()
{
FILE *in = fopen("heapuri.in","r");
FILE *out = fopen("heapuri.out","w");

int n;
fscanf(in,"%d",&n);
int i,x,y;
for (i=1;i<=n;i++)
{
fscanf(in,"%d",&x);
if (x==1) fscanf(in,"%d",&y),add(y);
else
if (x==2) fscanf(in,"%d",&y),use[y]=1;
else
{
while (use[ord[1]]) del(1);
fprintf(out,"%d\n",A[1]);
}
}
}