Cod sursa(job #370975)

Utilizator GotenAmza Catalin Goten Data 2 decembrie 2009 21:17:39
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream.h>

long a[200000],v[200000];

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=a[x];
 a[x]=a[y];
 a[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[rs(k)]<son)son=rs(k);
     if(a[son]>=a[k])son=0;
     }
   if(son)
    {
     v[a[son]]=k;
     v[a[k]]=son;
     ex(son,k);
     k=son;
     }
    }
   while(son);
 }

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

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

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

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

int main()
{
 long ii,n,nn,i,op,x,el;
 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,v[el]);
         }       
       else if(op==3) g<<a[1]<<'\n';
 }
 return 0;
 }