Cod sursa(job #2165192)

Utilizator Andrei17Andrei Pascu Andrei17 Data 13 martie 2018 11:26:27
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#include <climits>

using namespace std;

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

const int N = 200001;

int n, v[N], nh, h[N], poz[N];
vector <int> a[N];

inline void myswap(int p, int q) {
    int t1 = h[p], t2 = h[q];
    //poz[ h[p] ] = q;
    //poz[ h[q] ] = p;
    swap(h[p], h[q]);
    swap(poz[t1], poz[t2]);
    //poz[ h[p] ] = p;
    //poz[ h[q] ] = q;
}

void urca(int p) {
    while (p > 1 && v[ h[p] ] < v[ h[p >> 1] ]) {
        myswap(p, p >> 1);
        p >>= 1;
    }
}

void coboara(int p) {
    int f1 = p << 1, f2 = p << 1 + 1, best = p;

    if (f1 <= nh && v[ h[best] ] > v[ h[f1] ]) best = f1;
    if (f2 <= nh && v[ h[best] ] > v[ h[f2] ]) best = f2;

    if (best != p) {
        myswap(best, p);
        coboara(best);
    }
}

void adauga(int val) {
    h[++nh] = val;
    poz[n] = nh;
    urca(nh);
}

void sterge(int p) {
    myswap(p, nh--);
    urca(p);
    coboara(p);
}

int main()
{
    int op, len, x;
    in >> len;
    for (int i = 0; i < len; i++) {
        in >> op;
        if (op == 1) {
            in >> x;
            v[++n] = x;
            adauga(n);
        }
        if (op == 2) {
            in >> x;
            sterge(poz[x]);
        }
        if (op == 3) out << v[ h[1] ] << '\n';
    }
    in.close();
    out.close();
}