Cod sursa(job #2791984)

Utilizator guzgandemunteIonescu Laura guzgandemunte Data 31 octombrie 2021 16:31:55
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#define NMAX 200001

using namespace std;

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

int N, x, op;
int dim, contor;
int heap[2*NMAX], pozInHeap[NMAX], value[NMAX];

void interschimba(int i, int j){
    int aux;
    aux = heap[i], heap[i] = heap[j], heap[j] = aux;
    pozInHeap[heap[i]] = i;
    pozInHeap[heap[j]] = j;
}

void heapifyUp(int i){
    while (i > 1 && value[heap[i]] < value[heap[i/2]]){
        interschimba(i, i/2);
        i /= 2;
    }
}

void push(int val){
    heap[++dim] = contor;
    pozInHeap[contor] = dim;
    heapifyUp(dim);
}

void heapifyDown(int i){
    int left = 2*i, right = 2*i + 1, maxIndex = i;

    if (left <= dim && value[heap[left]] < value[heap[maxIndex]]) maxIndex = left;
    if (right <= dim && value[heap[right]] < value[heap[maxIndex]]) maxIndex = right;

    if (maxIndex != i){
        interschimba(i, maxIndex);
        heapifyDown(maxIndex);
    }
}

void removeIndex(int i){
    if (i == dim) dim--;
    else {
        heap[i] = heap[dim--];

        pozInHeap[heap[i]] = i;

        heapifyUp(i);
        heapifyDown(i);
    }
}

int main()
{
    fin >> N;
    for (int i = 0; i < N; ++i) {
        fin >> op;
        if (op == 1){
            fin >> x;
            value[++contor] = x;
            push(contor);
        }
        else if (op == 2){
            fin >> x;
            removeIndex(pozInHeap[x]);
        }
        else
            fout << value[heap[1]] << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}