Cod sursa(job #2025950)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 23 septembrie 2017 14:39:34
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#define DMAX 200001

using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");

int nr;
int val[DMAX];//date de intrare
int n, arb[DMAX], n1;//n - nr de elem. puse in arborele arb
int corespVal[DMAX];
int pozInArb[DMAX];

inline int tataNod(int k){
  return k / 2;
}

inline int fiuStanga(int k){
  return k * 2;
}

inline int fiuDreapta(int k){
  return k * 2 + 1;
}

//tatal unui nod trebuie sa fie mai mic decat toti fii sai
void validareSus(int k){
  while((k > 1) && (corespVal[arb[tataNod(k)]] > corespVal[arb[k]])){
    swap(arb[k],arb[tataNod(k)]);
    swap(pozInArb[arb[k]],pozInArb[arb[tataNod(k)]]);
    k = tataNod(k);
  }
}

void inserare(int valoare){
  corespVal[++ n1] = valoare;
  arb[++ n] = n1;
  pozInArb[n1] = n;
  validareSus(n);
}

void validareJos(int k){
  int fiu;// decid pe ce ramura ma duc
  do{
    fiu = 0;
    if(fiuStanga(k) <= n){
      fiu = fiuStanga(k);
      if((fiuDreapta(k) <= n) && (corespVal[arb[fiuStanga(k)]] > corespVal[arb[fiuDreapta(k)]])){
        fiu = fiuDreapta(k);
      }
      if(arb[fiu] >= arb[k]){
        fiu = 0;
      }
    }
    if(fiu != 0){
      swap(arb[k], arb[fiu]);
      swap(pozInArb[arb[k]],pozInArb[arb[fiu]]);
      k = fiu;
    }
  }while(fiu != 0);
}

void stergereArb(int k){
  arb[k] = arb[n];
  pozInArb[arb[n]] = k;
  n--;
  validareJos(k);
}


inline void minim(){
  out << corespVal[arb[1]] << '\n';
}

void citire(){
  int tip ;
  in >> nr;
  for(int i = 1; i <= nr; i++){
    in >> tip;
    if(tip == 1){
      int x;
      in >> x;
      inserare(x);//ok
    }else if(tip == 2){
      int x;
      in >> x;
      stergereArb(pozInArb[x]);
    }else{
      minim();
    }
  }

}

int main(){
  citire();
  return 0;
}