Cod sursa(job #844657)

Utilizator LuffyBanu Lavinia Luffy Data 29 decembrie 2012 17:49:16
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#define dim 200005
#define inf 99999999
#define swap(a,b)(a=a+b, b=a-b, a=a-b)

using namespace std;

int i,j,n,m,x,Min,poz,op,k;
int v[dim],man[dim],super[dim];

FILE *f=fopen("heapuri.in","r"), *g=fopen("heapuri.out","w");

void percolate(int i)
{int j, p;

 v[i] = x;
 j = i; man[i] = i; super[i] = i;
 p = i/2;

    while(p > 0)
  {
     if(x < v[p])
        {swap(v[j],v[p]); swap(super[j], super[p]);
         swap(man[super[j]],man[super[p]]);
         j=p;  p=p/2;
         }
     else  break;
  }

}

void sift(int i)
{int j,p;

  v[i] = v[m];

  //man[i] = man[m];
  m--;
  x = v[i];
  j = i;
  p = i*2;
  Min = inf;

   while(p <= m)
  {
     if( (v[p] < v[p+1]) || (p==m) ) {Min = v[p]; poz=p;}
     else {Min = v[p+1]; poz=p+1;}

     if(x > v[poz])
      {swap(v[j],v[poz]); swap(super[j],super[poz]); swap(man[super[j]], man[super[poz]]);
       j=poz; p=poz*2;
       }

     else break;
  }


}




int main()
{

 fscanf(f,"%d",&n);

 for(i=1; i<=n; i++)
  {fscanf(f,"%d",&op);

  if(op < 3)
   {k++;
    fscanf(f,"%d",&x);
    if(op == 1) {m++; percolate(k);}
    else {sift(man[x]); man[x] = 0;}
    }

  else fprintf(g,"%d\n",v[1]);


  }

 return 0;
}