Cod sursa(job #3163288)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 31 octombrie 2023 10:46:05
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 2e5 + 20;
int n;

int poz[N];

struct heapStruct {
    int val;
    int poz;
} heap[N];

int heapAdd ( int x, int k ) {
    
    heap[k].val = x;
    heap[k].poz = k;
    
    while ( heap[k].val < heap[k/2].val && k > 1 ) {
        
        swap ( poz[heap[k].poz], poz[heap[k/2].poz] );
        swap ( heap[k], heap[k/2] );
        
        k = k / 2;
    }
    
    return 0;
    
}

int heapErase ( int x, int k ) {

    heap[x] = heap[k];
    poz[heap[x].poz] = x;
    heap[k].poz = heap[k].val = 0;
    
    while ( x * 2 < k ) {
        
        if ( heap[x].val > heap[x*2].val ) {
            swap ( poz[heap[x].poz], poz[heap[x*2].poz] );
            swap ( heap[x], heap[x*2] );
        }
        else if ( heap[x].val > heap[x*2 + 1].val ) {
            swap ( poz[heap[x].poz], poz[heap[x*2+1].poz] );
            swap ( heap[x], heap[x*2+1] );
        }
        x = x * 2;
    }
    
    while ( heap[x].val < heap[x/2].val && x > 1 ) {
        
        swap ( poz[heap[x].poz], poz[heap[x/2].poz] );
        swap ( heap[x], heap[x/2] );
        
        x = x / 2;
    }
    
    return 0;
}

int main() {
    
    int t, cer, x, n1 = 0;
    
    fin >> t;
    
    for ( int i = 0; i < t; i++ ) {
        
        fin >> cer;
        
        if ( cer == 1 ) {
            fin >> x;
            n++;
            n1++;
            poz[n1] = n;
            heapAdd (x, n);
        }
        
        else if ( cer == 2 ) {
            fin >> x;
    
            heapErase (poz[x], n);
            poz[x] = 0;
       
            n--;
        }
        
        else
            fout << heap[1].val << "\n";
    }
    
    return 0;
}