Cod sursa(job #1861699)

Utilizator Mstar_AngelComan Mara Stefania Mstar_Angel Data 29 ianuarie 2017 11:06:38
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include<stdio.h>
int heap[200011];
int N;// dim heap
int v[200011];
int poz[200011];

int parent(int k){
  return k/2;
}
int kid1 (int k){
  return 2*k ;
}
int kid2 (int k){
  return 2*k + 1;
}

int min_heap(){
  return v[heap[1]];
}
void promoveaza (int k){
  int aux = heap[k];
  while ( k > 1 && v[aux] < v[heap[parent(k)]]){
    heap[k] = heap[parent(k)];
    poz[heap[parent(k)]] = k;
    k = parent(k);
  }
  heap[k] = aux;
  poz[aux] = k;
}

void cerne (int k){
  int kid,aux;
  do {
    kid = -1;
    // Alege un fiu mai mare ca tatal.
    if (kid1(k) <= N) {
      kid = kid1(k);
      if (kid2(k) <= N && heap[kid2(k)] < heap[kid1(k)])
        kid = kid2(k);
      if (heap[kid] >= heap[k])
        kid = -1;
    }
    if (kid != -1) {
      aux = heap[k]; heap[k] = heap[kid]; heap[kid] = k;
      aux = poz[v[heap[k]]]; poz[v[heap[k]]] = poz[v[heap[kid]]]; poz[v[heap[kid]]] = aux;
      k = kid;
    }
  } while (kid != -1);
}


void insert_heap (int k){
  promoveaza(k);
}

void cut(int k){
  if ((k>1) && (v[heap[k]] < v[heap[parent(k)]]))
    promoveaza (k);
  else
    cerne (k);
}

int main (){
  FILE *in,*out;
  in = fopen ("heapuri.in","r");
  out = fopen ("heapuri.out","w");
  int m,i,x,n,cod;
  fscanf(in,"%d",&m);
  n = 0;// elem vector
  for (i=1;i<=m;i++){
    fscanf(in,"%d",&cod);
    if (cod <= 2){
      fscanf(in,"%d",&x);
      if (cod == 1){
        n ++;N++;
        v[n] = x;
        heap[N] = n;
        poz[n] = N;
        insert_heap (N);
      }
      else {// cod == 3
        heap [poz[x]] = heap[N];// pun ultimul elem din heap pe poz elementului de scos
        poz[heap [poz[x]]] = poz[x];// updatez noua poz
        n--;
        cut (poz[x]);
      }
    }// cod <=2
    else {//cod == 3
      fprintf (out,"%d\n",min_heap());//returneaza rad heap-ului (val minimia)
    }
  }// for



  fclose (in);
  fclose (out);
  return 0;
}