Cod sursa(job #1622703)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 1 martie 2016 13:43:26
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
#define maxi 1000000005
using namespace std;

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

int n;
vector<int> H; /// index
vector<int> V; /// value
vector<int> O; /// order

void heapify(int len) {
    int poz = len;
    while (poz > 0) {
        if (V[H[poz]] < V[H[poz/2]]) {
            int aux = H[poz];
            H[poz] = H[poz/2];
            H[poz/2] = aux;

            O[H[poz]] = poz;
            O[H[poz/2]] = poz/2;

            poz /= 2;
        } else {
            break;
        }
    }
}

inline int minim(int a, int b) {
    if (a<b)return a;
    return b;
}

void del(int len, int no) {
    V[no] = maxi;
    int poz = O[no];
    while (poz < len) {
        int left = 2*poz;
        int right = 2*poz+1;
        if (left > len) left = poz;
        if (right > len) right = poz;

        int chosen;

        if (minim(V[H[left]], V[H[right]]) != V[H[poz]]) {
            if (minim(V[H[left]], V[H[right]]) == V[H[left]]) {
                chosen = left;
            } else {
                chosen = right;
            }
        }

        int aux = H[chosen];
        H[chosen] = H[poz];
        H[poz] = aux;

        O[H[chosen]] = chosen;
        O[H[poz]] = poz;

        if (poz == chosen) break;
        poz = chosen;
    }
}

void read() {
    int op = 0;
    f>>n;
    H.resize(n);
    V.resize(n);
    O.resize(n);
    for (int i=0;i<n;i++) {
        int tip;
        int x;
        f>>tip;
        if (tip == 1) {
            f>>x;
            H[op] = op; /// indexul numarului pe pozitia i
            V[op] = x; /// valoarea numarului cu indexul i
            O[op] = op; /// pozitia numarului ce are indexul i
            heapify(op); op++;
        } else if (tip == 2) {
            f>>x;
            del(i, x-1);
        } else if (tip == 3) {
            g<<V[H[0]]<<'\n';
        }
    }
}

int main() {

    read();

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