Cod sursa(job #1500993)

Utilizator SzymonSidorSzymonSidor SzymonSidor Data 12 octombrie 2015 22:28:37
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <vector>

#define pb push_back

using namespace std;

vector <int> added;
vector <pair <int, int> > minHeap;

void HeapUp(int node) {
    if (!node)
        return;
    if (minHeap[node].first < minHeap[node / 2].first) {
        swap(minHeap[node], minHeap[node / 2]);
        swap(added[minHeap[node].second], added[minHeap[node / 2].second]);
        HeapUp(node / 2);
    }
}

void HeapDown(int node) {
    int candidate = 0;
    if (node * 2 + 1 < minHeap.size())
        candidate = node * 2 + 1;
    if (node * 2 + 2 < minHeap.size() && minHeap[node * 2 + 1].first > minHeap[node * 2 + 2].first)
        candidate++;
    if (candidate && minHeap[node] > minHeap[candidate]) {
        swap(minHeap[node], minHeap[candidate]);
        swap(added[minHeap[node].second], added[minHeap[candidate].second]);
        HeapDown(candidate);
    }
}       

int Remove(int index) {
    swap(added[minHeap[minHeap.size() - 1].second], added[index]);
    swap(minHeap[minHeap.size() - 1], minHeap[added[minHeap[minHeap.size() - 1].second]]);
    minHeap.pop_back();
    if (added[index] != minHeap.size()) {
        HeapUp(added[index]);
        HeapDown(added[index]);
    }
}

int main() {
    ifstream cin("heapuri.in");
    freopen("heapuri.out", "w", stdout);
    
    int operations;
    for (cin >> operations; operations; operations--) {
        int opType;
        cin >> opType;
        if (opType == 3)
            printf("%d\n", minHeap[0].first);
        else if (opType == 2) {
            int index;
            cin >> index;
            Remove(index - 1);
        }
        else {
            int number;
            cin >> number;
            minHeap.pb(make_pair(number, added.size())); 
            added.pb(minHeap.size() - 1);
            HeapUp(added[added.size() - 1]);
        }
    }

    return 0;
}