Cod sursa(job #1887270)

Utilizator eusebiu_gageaGagea Eusebiu-Andrei eusebiu_gagea Data 21 februarie 2017 14:50:59
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <assert.h>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

#define NMAX 200001

int n, L, NR;
int Heap[NMAX], /// Heap[x] = al catelea element in ordine cronologica sa afla in x,
    Pos[NMAX], /// Pos[x] = pe ce pozitie in arbore(heap) se afla al x-lea element in ordine lexicografica
    A[NMAX]; /// A[x] = valoare celui de al x-lea element;

void promoveaza(int k) {
    int aux;

    while(k > 1 && A[Heap[k]] < A[Heap[k/2]]) {
        aux = Heap[k/2];
        Heap[k/2] = Heap[k];
        Heap[k] = aux;

        Pos[Heap[k]] = k;
        Pos[Heap[k/2]] = k/2;

        k = k / 2;
    }
}

void cerne(int x) {
    int aux, y = 0;

    while (x != y)
    {
        y = x;

        if (y*2<=L && A[Heap[x]]>A[Heap[y*2]]) x = y*2;
        if (y*2+1<=L && A[Heap[x]]>A[Heap[y*2+1]]) x = y*2+1;

        aux = Heap[x];
        Heap[x] = Heap[y];
        Heap[y] = aux;

        Pos[Heap[x]] = x;
        Pos[Heap[y]] = y;
    }
}

void afis(int a[NMAX]) {
    for(int i = 1; i <= NR; i++)
        g<<a[i]<<' ';
    g<<'\n';
}

void afisare() {
    afis(Pos);
    afis(Heap);
    afis(A);
    g<<'\n';
}

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

    int i, val, cod;

    scanf("%d", &n);

    for(i = 1; i <= n; i++) {
        scanf("%d", &cod);

        if(cod < 3)
            scanf("%d", &val);

        if(cod == 1) {
            L++, NR++;
            A[NR] = val;
            Heap[L] = NR;
            Pos[NR] = L;

            promoveaza(L);
        } else if(cod == 2) {
            A[val] = -1;
            promoveaza(Pos[val]);
            Pos[Heap[1]] = 0;
            Heap[1] = Heap[L--];
            Pos[Heap[1]] = 1;
            if (L>1) cerne(1);
        } else {
            printf("%d\n", A[Heap[1]]);
        }
    }

    return 0;
}