Cod sursa(job #371016)

Utilizator GotenAmza Catalin Goten Data 3 decembrie 2009 01:47:51
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream.h>

long a[2000],v[2000],m,h[2000];

long ls(long k)
{
 return (k<<1);
 }
long rs(long k)
{
 return ((k<<1)+1);
 }
long f(long k)
{
 return (k>>1);
 }

void ex(long x, long y)
{
 long aux;
 aux=h[x];
 h[x]=h[y];
 h[y]=aux;
 }


void sift(long n, long k)
{
 long son;
 do
  {
   son=0;
   if(ls(k)<=n)
    {
     son=ls(k);
     if(rs(k)<=n&&a[h[rs(k)]]<a[h[son]])son=rs(k);
     if(a[h[son]]>=a[h[k]])son=0;
     }
   if(son)
    {
     v[h[son]]=k;
     v[h[k]]=son;
     ex(son,k);
     k=son;
     }
    }
   while(son);
 }

void percolate(long k)
{
 long key=a[h[k]],kk=h[k];
 while(k>1&&key<a[h[f(k)]])
  {
   h[k]=h[f(k)];
   v[h[f(k)]]=k;
   k=f(k);
   }
 h[k]=kk;
 v[kk]=k;
 }

void bh(long n)
{
 long i;
 for(i=n>>1;i;i--)sift(n,i);
 }

void cut(long &n, long k)
{
 int kk=k;
 h[v[k]]=h[n];
 n--;
 k=v[k];
 if(k>1&&a[h[k]]<a[h[f(k)]])percolate(k);
 else sift(n,k);
 v[kk]=0;
 }

void insert(long &n, long key)
{
 n++;
 v[++m]=n;
 a[m]=key;
 h[n]=m;
 percolate(n);
 }

int main()
{
 long n,nn,i,op,x,el,j;
 ifstream f("heapuri.in");
 ofstream g("heapuri.out");
 f>>nn;
 n=0;
 for(i=1;i<=nn;i++)
 {
  f>>op;
  if(op==1)
   {
    f>>x;
    insert(n,x);
    }
  else if(op==2)
	{
         f>>el;
	 cut(n,el);
         }       
       else if(op==3) g<<a[h[1]]<<'\n';
 }
 return 0;
 }