Cod sursa(job #1012953)

Utilizator blasterzMircea Dima blasterz Data 19 octombrie 2013 22:44:27
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
using namespace std;
 
#define NMAX 200001
 
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
 
int i, n, p, cod, x, N;
 
int val[NMAX], poz[NMAX];
int H[NMAX];
 
void UP_heap(int u) {
    H[++n] = u;
    u = n;
    while (u != 1 && val[H[u]] < val[H[u / 2]]) 
        swap(H[u / 2], H[u]), swap(poz[H[u / 2]], poz[H[u]]), u /= 2;
}
 
void DOWN_heap(int u) {
    u = poz[u];
    poz[H[n]] = poz[H[u]];
    swap(H[u], H[n]);
    --n;
    while (1) {
        int m = u;
        if (u * 2 <= n && val[H[u * 2]] < val[H[u]]) m = u * 2;
        if (u * 2 + 1 <= n && val[H[u * 2 + 1]] < val[H[m]]) m = u * 2 + 1;
        if (u == m) 
            break;
        swap(H[u], H[m]);
        swap(poz[H[u]], poz[H[m]]);
        u = m;
    }
}
 
int main() {
    fin >> N;
    bool ok;
    for (i = 1; i <= N; ++i) poz[i] = i;
    for (i = 1; i <= N; ++i) {
        fin >> cod;
        if (cod != 3) {
            fin >> x;
            if (cod == 1) {
                val[++p] = x;
                UP_heap(p);
                continue;
            }
            DOWN_heap(x);
        }
        else
            fout << val[H[1]] << '\n';
    }
    return 0;
}