Cod sursa(job #2132577)

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

struct per
{
    int x, y;
} v[200003], a[200003];

int n;

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

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

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

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

    p.x = x;
    p.y = k;
    v[++n] = p;

    a[k].x = x;
    a[k].y = n;

    percolate(n);
}

void erase(int k)
{
    v[a[k].y] = v[n--];
    sift(a[k].y);
}

/*
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].x);
    }
}