Cod sursa(job #2596763)

Utilizator CharacterMeCharacter Me CharacterMe Data 10 aprilie 2020 12:53:16
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

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

int q, l, ind;
int heap[200005], pos[200005], opp[200005];

void rise(int i);
void lower(int i);

int main()
{

    fin >> q;
    while(q--){
        int task;
        fin >> task;

        if(task == 1){
            int x;
            fin >> x;

            heap[++l] = x;
            pos[++ind] = l;
            opp[l] = ind;
            rise(l);
        }
        else if(task == 2){
            int x;
            fin >> x;

            heap[pos[x]] = INT_MAX;
            lower(pos[x]);
        }
        else{
            fout << heap[1] << "\n";
        }
    }

    return 0;
}

void rise(int i){
    if(i == 1) return;
    if(heap[i] >= heap[i / 2]) return;

    swap(pos[opp[i]], pos[opp[i / 2]]);
    swap(opp[i], opp[i / 2]);
    swap(heap[i], heap[i / 2]);

    rise(i / 2);
}

void lower(int i){
    if(2 * i > l) return;
    else if(2 * i == l && heap[i] <= heap[2 * i]) return;
    else if(heap[i] <= min(heap[2 * i], heap[2 * i + 1])) return;

    int next;
    if(2 * i == l) next = 2 * i;
    else next = (heap[2 * i] <= heap[2 * i + 1] ? 2 * i : 2 * i + 1);

    swap(pos[opp[i]], pos[opp[next]]);
    swap(opp[i], opp[next]);
    swap(heap[i], heap[next]);

    lower(next);
}