Cod sursa(job #1861785)

Utilizator Mstar_AngelComan Mara Stefania Mstar_Angel Data 29 ianuarie 2017 12:04:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 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 = 0;
    // Alege un fiu mai mare ca tatal.
    if (kid1(k) <= N) {
      kid = kid1(k);
      if (kid2(k) <= N && v[heap[kid2(k)]] < v[heap[kid1(k)]])
        kid = kid2(k);
      if (v[heap[kid]] >= v[heap[k]])
        kid = 0;
    }
    if (kid != 0) {
      aux = heap[k]; heap[k] = heap[kid]; heap[kid] = aux;
      aux = poz[heap[k]]; poz[heap[k]] = poz[heap[kid]]; poz[heap[kid]] = aux;
      k = kid;
    }
  } while (kid != 0);
}


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

void cut(int k){
  promoveaza (k);
  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 --;
        if (poz[x] <= 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;
}