Cod sursa(job #3127313)

Utilizator GFA03Gavrila Florin-Alexandru GFA03 Data 7 mai 2023 14:33:46
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>

#define maxn 200005

int v[maxn] , back = 0, nr = 0; // nr = ordinea cronologica
std::unordered_map<int, int> inHeap; // un unordered_map de la ordinea cronologica la unde se afla in heap
std::unordered_map<int, int> inOrder; // unordered_map de la unde se afla in heap la ordinea cronologica

void heapUp(int pos)
{
    if(pos < 1)
        return;
    if(pos > back)
        return;
    if(v[pos] < v[pos/2])
    {
        int temp1 = inOrder[pos], temp2 = inOrder[pos/2], temp3 = inHeap[temp1];
        inOrder[pos] = inOrder[pos/2];
        inOrder[pos/2] = temp1;
        inHeap[temp1] = inHeap[temp2];
        inHeap[temp2] = temp3;
        std::swap(v[pos], v[pos/2]);
        heapUp(pos/2);
    }
}

void heapDown(int pos)
{
    if(pos < 1)
        return;
    if(pos > back)
        return;
    if(2 * pos > back)
        return;
    int minimum = 2 * pos;
    if(2 * pos + 1 <= back && v[2 * pos + 1] < v[2 * pos])
        minimum = 2 * pos + 1;
    if(v[pos] > v[minimum])
    {
        int temp1 = inOrder[pos], temp2 = inOrder[minimum], temp3 = inHeap[temp1];
        inOrder[pos] = inOrder[minimum];
        inOrder[minimum] = temp1;
        inHeap[temp1] = inHeap[temp2];
        inHeap[temp2] = temp3;
        std::swap(v[pos], v[minimum]);
        heapDown(minimum);
    }
}

void insert(int val)
{
    nr++;
    v[++back] = val;
    // inHeap.insert(nr, back);
    inHeap[nr] = back;
    inOrder[back] = nr;
    heapUp(back);
}

int getMin()
{
    if(back < 1)
        return 0;
    return v[1];
}

void deleteElem(int pos)
{
    int deletedElem = inHeap[pos];
    int temp1 = inOrder[deletedElem], temp2 = inOrder[back], temp3 = inHeap[temp1];
    inOrder[deletedElem] = inOrder[back];
    inOrder[back] = temp1;
    inHeap[temp1] = inHeap[temp2];
    inHeap[temp2] = temp3;
    std::swap(v[deletedElem], v[back]);
    v[back] = 0;
    back--;
    if(v[deletedElem] < v[deletedElem/2])
        heapUp(deletedElem);
    else
        heapDown(deletedElem);
}

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

int main()
{
    int n, x, y;
    fin >> n;
    for(int i = 0; i < n; ++i)
    {
        fin >> x;
        if(x == 1)
        {
            fin >> y;
            insert(y);
        }
        else if(x == 2)
        {
            fin >> y;
            deleteElem(y);
        }
        else{
            fout << getMin() << '\n';
        }
            
    }
}