Cod sursa(job #632299)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 10 noiembrie 2011 20:51:58
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
//min heap
#include <cstdio>
using namespace std;
#define MAXN 200005
#define MAXIM 10005

int heap[MAXN];
int poz[MAXN],v[MAXN];//poz[i]=locul in heap pe care se afla al i-lea element introdus
int N=0;

int pozitie=MAXIM-1;
char buff[MAXIM];//citesc bucati de cate maxim 10005 caractere

void cit(int &nr){
    nr=0;
    while(buff[pozitie]<'0' || buff[pozitie]>'9')//cat timp nu e cifra, treci mai departe
        if (++pozitie==MAXIM){
            fread (buff,1,MAXIM,stdin);
            pozitie=0;
        }
    while('0'<=buff[pozitie] && buff[pozitie]<='9'){//cat timp e cifra
        nr=nr*10+buff[pozitie]-'0';
        if (++pozitie==MAXIM){
            fread (buff,1,MAXIM,stdin);
            pozitie=0;
        }
     }
}



void urca(int loc){
   int x;
   int aux;
   while((x=loc/2) && v[heap[loc]]<v[heap[x]]){
      //interschimb nodul de pe locul loc cu tatal sau
      poz[heap[x]]=loc;
      poz[heap[loc]]=x;
      aux=heap[loc];
      heap[loc]=heap[x];
      heap[x]=aux;
      loc=x;
   }
}

void coboara(int loc){
   //cobor in fiul cel mai mic dintre cei doi
    int aux, x, y = 0;
    while (loc != y){
	y = loc;
	if ((x=y*2)<=N && v[heap[loc]]>v[heap[x]]) loc = x;
        x++;
	if (x<=N && v[heap[loc]]>v[heap[x]]) loc = x;
          aux = heap[loc];
	  heap[loc] = heap[y];
	  heap[y] = aux;
          poz[heap[loc]] = loc;
	  poz[heap[y]] = y;
	}
}

int main(){
  freopen ("heapuri.in","r",stdin);
  freopen ("heapuri.out","w",stdout);
  int n,cod,x,crono=1;
  int aux;
  cit(n);
  int i;
  for(i=0;i<n;i++){
     cit(cod);
     if(cod==1){
        //inserez
        cit(x);
        v[crono]=x;
        heap[++N]=crono;
        poz[crono]=N;
        crono++;       
        urca(N);
     }else
     if(cod==2){
        //sterg al x-lea element ca ordine cronologica....
        cit(x);
        v[x]=-1;//ceva negativ, pt a asigura urcarea pana la radacina...   
        urca(poz[x]);
        //poz[heap[1]]=0;
        heap[1]=heap[N--];
        poz[heap[1]]=1;
        if(N>1)coboara(1);
            //coboara(poz[x]);
     }else

     if(cod==3){
        //afisez minimul
        printf("%d\n",v[heap[1]]);
     }


  }
return 0;
}