Cod sursa(job #290656)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 28 martie 2009 14:56:30
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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],num[N],poz[N],vf=0;
void up(int k)
{int aux;
 if(k>1&&num[heap[tata(k)]]>num[heap[k]])
 {poz[heap[k]]=tata(k);
  poz[heap[tata(k)]]=k;
  aux=heap[tata(k)];  
  heap[tata(k)]=heap[k];
  heap[k]=aux;
  up(tata(k));  
 }   
}
void down(int k)
{int min=k,aux;
 if(st(k)<=vf&&num[heap[st(k)]]<num[heap[k]])
 {min=st(k);}
 if(dr(k)<=vf&&num[heap[dr(k)]]<num[heap[k]])
 {min=dr(k);}
 if(min!=k)
 {aux=heap[k];
  heap[k]=heap[min];
  heap[min]=aux;
  poz[heap[k]]=min;
  poz[heap[min]]=k;
 }
}
void solve(int k)
{
 up(k);
 down(k);
}



int main ()
{int n,cod,nr,i;
 freopen("heapuri.in","r",stdin);
 freopen("heapuri.out","w",stdout);
 scanf("%d",&n);
 
 for (vf=0,i=1;i<=n;i++)
 {scanf("%d",&cod);
  if(cod==1)
  {scanf("%d",&nr);
   vf++; 
   num[vf]=nr;
   heap[vf]=vf;
   poz[vf]=vf;
   up(vf);
  }

  if(cod==2)
  {scanf("%d",&nr);
   heap[poz[nr]]=heap[vf];
   vf--;
   solve(vf);
   
  }
  if(cod==3)
  {printf("%d\n",num[heap[1]]);
  }
 }
 
 return 0;
}