Cod sursa(job #2132542)

Utilizator RazorBestPricop Razvan Marius RazorBest Data 15 februarie 2018 20:33:50
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
using namespace std;

struct per
{
    int val, i;
} v[200003];

int n;

void sift(int k)
{
    int val = v[k].val, i = v[k].i;

    int son = (k << 1);
    while (son <= n)
    {
        if (son < n)
            if (v[son + 1].val < v[son].val)
                son++;
        if (val <= v[son].val)
            break;
        v[k] = v[son];
        k = son;
        son = (k << 1);
    }
    v[k].val = val;
    v[k].i = i;
}

void percolate(int k)
{
    int val = v[k].val, i = v[k].i;
    while (val < v[k / 2].val && k > 1)
    {
        v[k] = v[k >> 1];
        k >>= 1;
    }
    v[k].val = val;
    v[k].i = i;
}

void insert(int x, int k)
{
    per p;

    p.val = x;
    p.i = k;
    v[++n] = p;
    percolate(n);
}

void erase(int k)
{
    for (int i = 1; i <= n; i++)
    {
        if (v[i].i == k)
        {
            v[i] = v[n--];
            sift(i);
            return;
        }
    }
}

/*
void print_heap()
{
    for (int i = 1; i <= n; i++)
        printf("%d ", v[i].val);
    printf("\n");
}*/

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);

    int x, y, k = 0, t;

    scanf("%d", &t);
    for (int i = 0; i < t; i++)
    {
        scanf("%d", &x);
        if (x < 3)
        {
            scanf("%d", &y);
            if (x == 1)
                insert(y, ++k);
            else
                erase(y);
        }
        else
            printf("%d\n", v[1]);
    }
}