Cod sursa(job #2087695)

Utilizator AhileGigel Frone Ahile Data 13 decembrie 2017 23:14:46
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
//#include<bits/stdc++.h>
using namespace std;
#define in f
#define out g
ifstream f ("heapuri.in");
ofstream g ("heapuri.out");

const int MAX_SIZE = 1e6;

int n, x, y, code, length, k;
int heap[MAX_SIZE], order[MAX_SIZE];
unordered_map<int, int>swapped;

void insert (int pos) {
    if (pos == 1)
        return;
    if (heap[pos] < heap[pos / 2]) {
        swap(heap[pos], heap[pos / 2]);
        swap(swapped[heap[pos]], swapped[heap[pos / 2]]);
        insert(pos / 2);
    }
    return;
}

void remove(int pos) {
    if (2 * pos > length)
        return;
    if (((heap[pos] > heap[2 * pos + 1]) && (2 * pos + 1) <= length) || (heap[pos] > heap[2 * pos])) {
        if ((heap[2 * pos + 1] > heap[2 * pos]) || ((2 * pos + 1) > length)) {
            swap(heap[2 * pos], heap[pos]);
            swap(swapped[heap[2 * pos]], swapped[heap[pos]]);
            remove(2 * pos);
        } else {
            swap(heap[2 * pos + 1], heap[pos]);
            swap(swapped[heap[2 * pos + 1]], swapped[heap[pos]]);
            remove(2 * pos + 1);
        }
    }
    return;
}

void minn() {
    out << heap[1] << "\n";
}

int main() {
    in >> n;
    for(int i = 1; i <= n; i++) {
        in >> code;
        if(code == 1) {
            in >> x;
            k++;
            order[k] = x;
            length++;
            heap[length] = x;
            swapped[x] = length;
            insert(length);
        } else if(code == 2) {
            in >> x;
            int pos = swapped[order[x]];
            swap(heap[pos], heap[length]);
            heap[length] = 0;
            swapped[heap[pos]] = swapped[order[x]];
            swapped[order[x]] = 0;
            length--;
            remove(pos);
        } else if(code == 3) {
            minn();
        }
    }
    
}