Cod sursa(job #2836718)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 20 ianuarie 2022 20:01:28
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 2e5 + 1;
int n, op, val, h;
int crono[N], timp;
int heap[N];

void urca(int p){
    while(heap[p] < heap[p / 2]){
        swap(heap[p], heap[p / 2]);
        swap(crono[p], crono[p / 2]);
        p /= 2;
    }
}

void coboara(int p){
    int bun = p;
    if(2 * p <= h && heap[2 * p] < heap[bun])
        bun = 2 * p;

    if(2 * p + 1 <= h && heap[2 * p + 1] < heap[bun])
        bun = 2 * p + 1;

    if(bun != p){
        swap(heap[p], heap[bun]);
        swap(crono[p], crono[bun]);
        coboara(bun);
    }
}

void minim(){
    g << heap[1] << '\n';
    heap[1] = heap[h];
    crono[1] = crono[h--];
    coboara(1);
}

void insereaza(int val){
    heap[++h] = val;
    crono[h] = ++timp;
    urca(h);
}

void sterge(int cronp){
    int p = crono[cronp];
    if(p == h){
        h--;
        return;
    }

    heap[p] = heap[h];
    crono[p] = crono[h];
    if(heap[p] < heap[p / 2])
        urca(p);
    else
        coboara(p);
}

int main(){
    f >> n;
    while(n--){
        f >> op;
        if(op == 1){
            f >> val;
            insereaza(val);
        }else if(op == 2){
            f >> val;
            sterge(val);
        }else
            minim();
    }

    f.close();
    g.close();
}