Cod sursa(job #3208844)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 1 martie 2024 10:53:50
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
#warning sunt pe onlinegdb

using namespace std;

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

const int nmax = 2e5;
int heap[5 + nmax], v[5 + nmax], del[5 + nmax];

void siftDown(int i, int n) {
    int imin, vmin, val;
    vmin = val = heap[imin = i];
    if (2 * i <= n && v[heap[2 * i]] < v[vmin]) {
        vmin = heap[imin = 2 * i];
    }
    if (2 * i + 1 <= n && v[heap[2 * i + 1]] < v[vmin]) {
        vmin = heap[imin = 2 * i + 1];
    }
    while (imin > i) {
        heap[i] = heap[imin];
        i = imin;
        vmin = val;
        if (2 * i <= n && v[heap[2 * i]] < v[vmin]) {
            vmin = heap[imin = 2 * i];
        }
        if (2 * i + 1 <= n && v[heap[2 * i + 1]] < v[vmin]) {
            vmin = heap[imin = 2 * i + 1];
        }
    }
    heap[i] = val;
}

void siftUp(int i) {
    int c, val = heap[i];
    while (i > 1 && v[heap[c = i / 2]] > v[val]) {
        heap[i] = heap[c];
        i = c;
    }
    heap[i] = val;
}

inline void insert(int i, int &n) {
    heap[++n] = i;
    siftUp(n);
}

inline void deleteMin(int &n) {
    heap[1] = heap[n--];
    siftDown(1, n);
}

int main() {
    int n;
    fin >> n;
    int pos = 0, m = 0;
    while (n--) {
        int type;
        fin >> type;
        if (type == 1) {
            fin >> v[++pos];
            insert(pos, m);
        } else if (type == 2) {
            int val;
            fin >> val;
            del[val] = 1;
        } else {
            while (del[heap[1]]) {
                deleteMin(m);
            }
            fout << v[heap[1]] << '\n';
        }
    }
    return 0;
}