Cod sursa(job #301020)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 7 aprilie 2009 20:55:10
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#define N 200001
#define st(x) 2*(x)
#define dr(x) 2*(x)+1
#define tata(x) (x)/2
int heap[N],ele[N],poz[N],vf,vfheap;
void up(int k)
{int aux;
 if(k==1)return;
 if(ele[heap[tata(k)]]>ele[heap[k]])
 {aux=heap[tata(k)];
  heap[tata(k)]=heap[k];
  heap[k]=aux;
  poz[heap[tata(k)]]=tata(k);
  poz[heap[k]]=k;
  up(tata(k));
 }
}
void down(int k)
{int min=k,aux;

 if(st(k)<=vfheap&&ele[heap[st(k)]]<ele[heap[min]])
 {min=st(k);
 }
 if(dr(k)<=vfheap&&ele[heap[dr(k)]]<ele[heap[min]])
 {min=dr(k);
 }
 if(min!=k)
 {aux=heap[k];heap[k]=heap[min];heap[min]=aux;
  poz[heap[min]]=min;
  poz[heap[k]]=k;
  down(min);
 }
}
void adauga(int a)
{vfheap++;vf++;
 ele[vf]=a;
 heap[vfheap]=vf;
 poz[vf]=vfheap;
 up(vfheap);
}
void sterge(int a)
{heap[poz[a]]=heap[vfheap];
 poz[heap[vfheap]]=poz[a];
 vfheap--;
 up(poz[a]);
 down(poz[a]);
 poz[a]=0;
}
int main ()
{int i,a,b,n;
 freopen("heap.in","r",stdin);
 freopen("heap.out","w",stdout);
 scanf("%d",&n);
 for (i=1,vfheap=0,vf=0;i<=n;i++)
 {scanf("%d",&a);
  if(a==1)scanf("%d",&b),adauga(b);
  else if(a==2) scanf("%d",&b),sterge(b);
  else printf("%d\n",ele[heap[1]]);
 }
 return 0;
}