Cod sursa(job #2238090)

Utilizator pinteastefanPintea Teodor Stefan pinteastefan Data 4 septembrie 2018 16:53:37
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>

using namespace std;
const int MAX = static_cast<const int>(2e5 + 14);
pair <int, int> heap[MAX];
int numberOfNodes;
int fv [MAX];

void downNode (int nod)
{
    if (nod * 2 <= numberOfNodes and nod * 2 + 1 <= numberOfNodes)
    {
        if (heap[nod].first > heap [nod * 2].first and heap [nod].first > heap [nod * 2 + 1].first){
            if (heap [nod * 2].first > heap [nod * 2 + 1].first)
            {
                swap (heap[nod * 2 + 1], heap [nod]);
                downNode(nod * 2 + 1);
                return;
            }
            else
            {
                swap (heap[nod * 2], heap [nod]);
                downNode(nod * 2);
                return;
            }
        }
    }
    if (nod * 2 + 1 <= numberOfNodes and heap [nod * 2 + 1].first < heap [nod].first)
    {
        swap (heap[nod * 2 + 1], heap [nod]);
        downNode(nod * 2 + 1);
        return;
    }
    if (nod * 2 <= numberOfNodes and heap [nod * 2].first < heap [nod].first)
    {
        swap (heap[nod * 2], heap [nod]);
        downNode(nod * 2);
        return;
    }
}

void delNode (int nod)
{
    swap(heap[1], heap [numberOfNodes]);
    numberOfNodes -= 1;
    downNode (1);
}

void upNode (int nod)
{
    if (numberOfNodes / 2 == 0) return;
    if (heap[numberOfNodes / 2].first > heap[numberOfNodes].first) {
        swap(heap[numberOfNodes / 2], heap[numberOfNodes]);
        upNode(nod);
    }

}

void insertNode(int val, int &nr)
{
    numberOfNodes++;
    heap[numberOfNodes] = {val, ++nr};
    upNode(numberOfNodes);
}
int main() {
    ifstream inputFile("heapuri.in");
    ofstream outputFile("heapuri.out");
    int n, x, nod, nr, a;
    inputFile >> n;
    for (int i = 1; i<=n; i++)
    {
        inputFile >> x;
        if (x == 1) {
            inputFile >> nod;
            insertNode(nod, nr);
        }
        else if (x == 2){
            inputFile >> a;
            fv [a] = 1;
        }
        else {
            while(numberOfNodes and fv [heap[1].second])
                delNode(1);
            outputFile << heap[1].first << '\n';
        }
    }
    return 0;
}