Cod sursa(job #2896489)

Utilizator PatrascuAdrian1Patrascu Adrian Octavian PatrascuAdrian1 Data 29 aprilie 2022 23:25:52
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int Nmax = 2e5 + 5;
int T, c, x, N, v;
int A[Nmax], H[Nmax], poz[Nmax];

void Percolate(int node)
{
    while(node > 0 && A[H[node / 2]] > A[H[node]])
    {
        swap(H[node], H[node / 2]);
        swap(poz[H[node]], poz[H[node / 2]]);
        node /= 2;
    }
}

void Sift(int node)
{
    while(node <= N)
    {
        int Min = node, left = 2 * node, right = 2 * node + 1;
        if (left <= N && A[H[left]] < A[H[Min]])
            Min = left;
        if (right <= N && A[H[right]] < A[H[Min]])
            Min = right;
        if (Min == node)
            break;
        swap(H[node], H[Min]);
        swap(poz[H[node]], poz[H[Min]]);
        node = Min;
    }
}

void Add(int x)
{
    A[++v] = x;
    H[++N] = v;
    poz[v] = N;
    Percolate(N);
}

void Delete(int node)
{
    if (node == N)
        N--;
    else
    {
        swap(H[node], H[N]);
        swap(poz[H[node]], poz[H[N]]);
        N--;
        Sift(node);
        Percolate(node);
    }
}

int main()
{
    in >> T;
    while(T--)
    {
        in >> c;
        if (c == 1)
        {
            in >> x;
            Add(x);
        }
        else if (c == 2)
        {
            in >> x;
            Delete(poz[x]);
        }
        else if (c == 3)
            out << A[H[1]] << '\n';
    }
    return 0;
}