Cod sursa(job #1754507)

Utilizator AplayLazar Laurentiu Aplay Data 8 septembrie 2016 13:25:22
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include<bits/stdc++.h>

#define NMAX 200001
#define swapp(x, y) { int tmp = x; x = y; y = tmp; }

using namespace std;

int N, operation, element, heap[NMAX], heapPz[NMAX], numbers[NMAX], counter = 0;

void heapMoveUp(int position) {
    while (position / 2 && numbers[heap[position]] < numbers[heap[position / 2]]) {
        swapp(heap[position], heap[position / 2]);
        swapp(heapPz[heap[position]], heapPz[heap[position / 2]]);
        position >>= 1;
    }
}

void heapMoveDown(int position) {
    int newPosition = -1, left, right;

    while(position != newPosition) {
        newPosition = position;
        left  = position * 2;
        right = left + 1;

        if (left <= heap[0] && numbers[heap[left]] < numbers[heap[newPosition]]) newPosition = left;
        if (right <= heap[0] && numbers[heap[right]] < numbers[heap[newPosition]]) newPosition = right;

        if (newPosition != position) {
            swapp(heap[position], heap[newPosition]);
            swapp(heapPz[heap[position]], heapPz[heap[newPosition]]);
            position = newPosition;
            newPosition = -1;
        }
    }
}

void heapInsert(int position) {
    heap[++heap[0]] = position;
    heapPz[position] = heap[0];

    heapMoveUp(heap[0]);
}

void heapDelete(int position) {
    numbers[position] = -1;
    heapMoveUp(heapPz[position]);

    swapp(heap[heapPz[position]], heap[heap[0]]);
    heapPz[heap[1]] = 1;

    --heap[0];
    if (heap[0] > 1) heapMoveDown(1);
}

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

    scanf("%d", &N);

    for (int it = 1; it <= N; ++it) {
        scanf("%d", &operation);
        switch(operation) {
        case 1:
            scanf("%d", &numbers[++counter]);
            heapInsert(counter);
            break;
        case 2:
            scanf("%d", &element);
            heapDelete(element);
            break;
        case 3:
            printf("%d\n", numbers[heap[1]]);
            break;
        }
    }

    return 0;
}