Cod sursa(job #845068)

Utilizator LuffyBanu Lavinia Luffy Data 30 decembrie 2012 13:48:32
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 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 j, p;

 v[m] = x;
 j = m; super[m] = k; man[super[m]] = m;
 p = m/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]]);
         man[super[j]] = j; man[super[p]] = p;
         j=p;  p=p/2;
         }
     else  break;
  }

}

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

  v[i] = v[m];

  super[i] = super[m];
  man[super[i]] = m;
  //man[super[m]] = 0;


  //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]);
       man[super[j]] = j; man[super[poz]] = poz;
       j=poz; p=poz*2;
       }

     else break;
  }

  j = 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]]);
         man[super[j]] = j; man[super[p]] = p;
         j=p;  p=p/2;
         }
     else  break;
  }

}




int main()
{

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

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

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

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


  }

 return 0;
}