Cod sursa(job #2338246)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 7 februarie 2019 11:12:10
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <iostream>

#define NMAX 200000
#define STVAL 100000000
using namespace std;

int val [ NMAX + 1 ] ;

class Heap {
public :
  int poz [ NMAX + 1 ] ; /// poz[i] = al catelea nr. initial era val[i]
  int pozinit [ NMAX + 1 ] ; /// pozinit[i] = pe ce pozitie in heap este al i-lea nr.
  int n = 1 ;
  void initializare () {
    int i ;
    for (i = 0 ; i < NMAX ; i++ ) {
      val[i] = STVAL ;
      poz[i] = 0 ;
      pozinit[i] = 0 ;
    }
  }
  void sift (int k ) {
    int son, lson, rson ;
    do {
      lson = 2 * k ;
      rson = 2 * k + 1 ;
      if (val[lson] < val[rson] )
        son = lson ;
      else
        son = rson ;
      if (val[son] < val[k] ) {
        swap(val[son], val[k]) ;
        swap(poz[son], poz[k] ) ;
        swap(pozinit[poz[son]], pozinit[poz[k]] ) ;
      }
      else
        son = 0 ;
    } while (son != 0 ) ;
  }
  void percolate (int k ) {
    int father ;
    father = k / 2 ;
    while (val[father] > val[k] && k > 1 ) {
      swap(val[father], val[k] ) ;
      swap(poz[father], poz[k] ) ;
      swap(pozinit[poz[father]], pozinit[poz[k]] ) ;
      k = father ;
      father = k / 2 ;
    }
  }
  void build_heap () {
    int i ;
    for (i = n/2 ; i > 0 ; i-- )
      sift (i) ;
  }
  void insertelem (int x, int nr ) {
    poz[n] = nr ;
    pozinit[nr] = n ;
    val[n++] = x ;
    percolate(n-1) ;
  }
  void cutelem (int x ) {
    int k = pozinit[x], father ;
    val[k] = val[n-1] ;
    poz[k] = poz[n-1] ;
    pozinit[x] = -1 ;
    n--;
    father = k / 2 ;
    if (k > 1 && (val[k] < val[father] ) )
      percolate(k) ;
    else
      sift(k) ;
  }
};

int main() {

  FILE *fin, *fout ;
  fin = fopen ("heapuri.in", "r" ) ;
  fout = fopen ("heapuri.out", "w" ) ;
  int n, i, tip, elem, elemente ;
  fscanf (fin, "%d", &n ) ;
  Heap h ;
  h.initializare() ;
  elemente = 1 ;
  for (i = 0 ; i < n ; i++ ) {
    fscanf (fin, "%d", &tip ) ;
    switch (tip) {
      case 1 : {
        fscanf (fin, "%d", &elem ) ;
        h.insertelem(elem, elemente) ;
        elemente++;
        break ;
      }
      case 2 : {
        fscanf (fin, "%d\n", &elem ) ;
        h.cutelem(elem) ; /// elementul intrat al x ulea
        break ;
      }
      case 3 : {
        fprintf (fout, "%d\n", val[1] ) ;
        break ;
      }
    }
  }
  return 0;
}