Cod sursa(job #371024)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 3 decembrie 2009 05:33:35
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#define N 200000
int heap[N];//element [pozitie heap]
int chr[N];//ordine cronologica[pozitie heap]
int vh;//varf heap

int poz[N];//pozitia in heap[ordine cronologica]


void up(int kh)
{int t;
 while(kh>1&&heap[kh/2]>heap[kh])
 {t=heap[kh]; heap[kh]=heap[kh/2]; heap[kh/2]=t;

  poz[chr[kh]]=kh/2;
  poz[chr[kh/2]]=kh;

  t=chr[kh]; chr[kh]=chr[kh/2]; chr[kh/2]=t;
  kh/=2;
 }
}

void down(int kh)
{int min,kmin,t;
 do
 {min=heap[kh];
  kmin=kh;
  if(2*kh<=vh&&min>heap[2*kh])
  {min=heap[2*kh];
   kmin=2*kh;
  }
  if(2*kh+1<=vh&&min>heap[2*kh+1])
  {min=heap[2*kh+1];
   kmin=2*kh+1;
  }
  if(kmin!=kh)
  {t=heap[kmin]; heap[kmin]=heap[kh]; heap[kh]=t;

   poz[chr[kmin]]=kh;
   poz[chr[kh]]=kmin;

   t=chr[kmin]; chr[kmin]=chr[kh]; chr[kh]=t;
  }
 }
 while(kmin!=kh);
}

int main ()
{freopen("heapuri.in","r",stdin);
 freopen("heapuri.out","w",stdout);
 int m,i,x,y,t,chronos=0;
 scanf("%d",&m);
 
 for (i=0;i<m;i++)
 {scanf("%d",&x);
  if(x==1)//insereaza
  {scanf("%d",&y);
   heap[++vh]=y;
   chr[vh]=++chronos;
   poz[chr[vh]]=vh;
   up(vh);
  }
  else if(x==2) //sterge
  {scanf("%d",&y);
   heap[poz[y]]=heap[vh];
   chr[poz[y]]=chr[vh];
   poz[chr[vh]]=poz[y];
   vh--;
   t=poz[y];
   poz[y]=0;
   up(t);
   down(t);
  }
  else
  {printf("%d\n",heap[1]);
  }
 }
 
 return 0;
}