Cod sursa(job #3288118)

Utilizator pacelaaaCiurea Pavel pacelaaa Data 20 martie 2025 15:50:44
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.74 kb
#include <bits/stdc++.h>

using namespace std;

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

#define cin fin
#define cout fout
#define FR( a, b ) for( int a = 0; a < b; a ++ )
#define FOR( a, c, b ) for( int a = c; a < b; a++)

const int Nmax = 2e5+5, minimul = -1e9;

int heap[Nmax], pozitie[Nmax], val[Nmax];
int marime_heap = 0;

void swap_heap( int poz1, int poz2 ) {
  swap( pozitie[ heap[poz1] ], pozitie[ heap[poz2] ] );
  swap( heap[ poz1 ], heap[poz2] );
}

void sus( int poz_heap ) {
  if( poz_heap == 1 )
    return;

  int parinte = poz_heap / 2;
  while( poz_heap > 1 && val[ heap[parinte] ] > val[ heap[poz_heap] ]) {
    swap( pozitie[ heap[poz_heap] ], pozitie[ heap[parinte] ] );
    swap( heap[ poz_heap ], heap[ parinte ] );

    poz_heap = parinte;
    parinte /= 2;
  }
}

void jos( int poz_heap ) {
  if( 2 * poz_heap  > marime_heap )
    return;
  if( 2 * poz_heap == marime_heap ) {
    if( val[ heap[poz_heap] ] > val[ heap[2 * poz_heap] ] )
      swap_heap( poz_heap, 2 * poz_heap );
    return;
  }

  while( 2 * poz_heap < marime_heap && val[ heap[poz_heap] ] > min( val[ heap[ 2*poz_heap] ], val[ heap[2 * poz_heap + 1] ] ) ) {
    if( val[ heap[ 2*poz_heap] ] < val[ heap[2 * poz_heap + 1] ]) {
      swap_heap( poz_heap, 2 * poz_heap );
      poz_heap = 2 * poz_heap;
    } else {
      swap_heap( poz_heap, 2 * poz_heap + 1 );
      poz_heap = 2 * poz_heap + 1;
    }
  }
  if( 2 * poz_heap == marime_heap )
    if( val[ heap[poz_heap] ] > val[ heap[2 * poz_heap] ] )
      swap_heap( poz_heap, 2 * poz_heap );
}

void inserare( int poz ) {
  marime_heap++;
  heap[ marime_heap ] = poz;
  pozitie[ poz ] = marime_heap;
  sus( marime_heap );
}

void stergere( int timp ) {
  int poz_heap = pozitie[ timp ];
  //pozitie[ timp ] = -1;

  heap[ poz_heap ] = heap[ marime_heap ];
  pozitie[ heap[marime_heap] ] = poz_heap;
  marime_heap--;
  if( poz_heap == 1 ) {
    jos( poz_heap );
    return;
  }

  if( val[ heap[poz_heap] ] < val[ heap[ (poz_heap / 2) ] ] )
    sus( poz_heap );
  else
    jos( poz_heap );
}

void afisare_heap() {
  FOR( i, 1, marime_heap + 1 )
    cout << i << " " << val[heap[i]] << " " << heap[i] << " pozitie "  << '\n';
}

int main() {
    heap[0] = minimul;

    int n, valoare, timp, operatie;

    cin >> n;
    timp = 1;
    FR( i, n ) {
      //cout << "#operatie " << i << "\n";
      cin >> operatie;

      if( operatie == 1 ) {
        cin >> valoare;
        val[timp] = valoare;
        inserare( timp );
        timp++;
      } else if( operatie == 2 ) {
        cin >> valoare;
        stergere( valoare );
      } else
        cout << val[heap[1]] << '\n';
      //afisare_heap();
    }
    return 0;
}