Cod sursa(job #2207014)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 24 mai 2018 18:53:37
Problema Heapuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.77 kb
#include <stdio.h>
#define nmax 200001

int v[nmax];
int poz_heap, co;
int poz_nod[nmax];

int urcare_heap( int poz ) {
  int aux;
  while ( poz / 2 > 0 && v[ poz / 2 ] > v[ poz ] ) { ///interschimbam elementul cu tatal sau
    aux = v[ poz / 2 ];
    v[ poz / 2 ] = v[poz];
    v[poz] = aux;
    poz /= 2;
  }
  return poz;
}

int coborare_heap( int poz ) {
  int aux;
  while ( ( poz * 2 <= poz_heap && v[ poz * 2 ] < v[poz] ) ||  ( ( poz * 2 + 1 ) <= poz_heap && v[ poz * 2 + 1 ] < v[poz] ) ) {
    if ( v[ poz * 2 ] < v[poz] ) {
      aux = v[ poz * 2 ];
      v[ poz * 2 ] = v[poz];
      v[poz] = aux;
      poz *= 2;
    }
    else {
      aux = v[ poz * 2 + 1 ];
      v[ poz * 2 + 1 ] = v[poz];
      v[poz] = aux;
      poz = poz * 2 + 1;
    }
  }
  return poz;
}

void inserare_heap( int nr ) {
  int poz;
  co++;
  poz_heap++;
  v[poz_heap] = nr; ///inseram nr pe ultima pozitie in heap
  poz = poz_heap;
  poz = urcare_heap( poz );
  poz = coborare_heap( poz );
  poz_nod[co] = poz;
}

void stergere_heap( int ordin_insertie ) {
  int i, poz, aux;
  poz = poz_nod[ ordin_insertie ];
  aux = v[poz];
  v[poz] = v[poz_heap];
  v[poz_heap] = aux;
  poz_heap--;
  poz = urcare_heap( poz );
  poz = coborare_heap( poz );
  v[ordin_insertie] = poz;
}

int main() {
  int n, i, ver, nr;
  FILE *fin, *fout;
  fin = fopen( "heapuri.in", "r" );
  fout = fopen( "heapuri.out", "w" );
  fscanf( fin, "%d", &n );
  for ( i = 0; i < n; i++ ) {
    fscanf( fin, "%d", &ver );
    if ( ver == 3 )
      fprintf( fout, "%d\n", v[1] );
    else {
      fscanf( fin, "%d", &nr );
      if ( ver == 1 )
        inserare_heap( nr );
      else
        stergere_heap( nr );
    }
  }
  fclose( fin );
  fclose( fout );
  return 0;
}