Cod sursa(job #822433)

Utilizator chimistuFMI Stirb Andrei chimistu Data 23 noiembrie 2012 15:52:28
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <cstdlib>
#define nmax 200001
FILE*f=fopen("heapuri.in","r");
FILE*g=fopen("heapuri.out","w");
long v[nmax],poz[nmax],intr[nmax];
int k=0;

void swap(long &a,long &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
            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()
{
    long 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;
}