Cod sursa(job #3300477)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 16 iunie 2025 13:25:31
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 100004;

int heap_size;
int heap[NMAX];     // indexul de inserare (nu valoarea!)
int heap_val[NMAX]; // valoarea reală corespunzătoare heap[i]
bool valid[NMAX];   // dacă elementul cu indexul de inserare este valid

void check_up(int node_position)
{
    int dad_position = node_position / 2;
    if (heap_val[heap[dad_position]] > heap_val[heap[node_position]])
    {
        swap(heap[dad_position], heap[node_position]);
        check_up(dad_position);
    }
}

void check_down(int node_position)
{
    int left_son = node_position * 2;
    int right_son = left_son + 1;

    int current_min = heap_val[heap[node_position]], min_case = 0;

    if (left_son <= heap_size && current_min > heap_val[heap[left_son]])
    {
        current_min = heap_val[heap[left_son]];
        min_case = 1;
    }

    if (right_son <= heap_size && current_min > heap_val[heap[right_son]])
    {
        current_min = heap_val[heap[right_son]];
        min_case = 2;
    }

    if (min_case == 1)
    {
        swap(heap[node_position], heap[left_son]);
        check_down(left_son);
    }
    else if (min_case == 2)
    {
        swap(heap[node_position], heap[right_son]);
        check_down(right_son);
    }
}

void insert(int insert_index)
{
    heap[++heap_size] = insert_index;
    check_up(heap_size);
}

void pop()
{
    heap[1] = heap[heap_size];
    heap_size--;
    check_down(1);
}

void remove(int x)
{
    valid[x] = false; // marcam elementul ca invalid (nu il scoatem fizic din heap)
}

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    int op, x, n;
    scanf("%d", &n);

    int insert_index = 0;

    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &op);
        if (op == 1)
        {
            scanf("%d", &x);
            ++insert_index;
            heap_val[insert_index] = x;
            valid[insert_index] = true;
            insert(insert_index);
        }
        else if (op == 2)
        {
            scanf("%d", &x);
            remove(x);
        }
        else
        {
            while (!valid[heap[1]])
                pop();
            printf("%d\n", heap_val[heap[1]]);
        }
    }

    return 0;
}