Cod sursa(job #1012951)

Utilizator blasterzMircea Dima blasterz Data 19 octombrie 2013 22:42:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#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 Swap(int i, int j) {
    swap(H[i], H[j]);
    poz[ H[i] ] = i;
    poz[ H[j] ] = j;
}

void UP_heap(int u) {
    H[++n] = u;
    u = n;
    while (u != 1 && val[H[u]] < val[H[u / 2]]) 
        Swap(u, u / 2), u /= 2;
}
 
void DOWN_heap(int u) {
    //poz[H[n]] = poz[H[poz[u]]];
    //swap(H[poz[u]], H[n]);
    u = poz[u];
    Swap(u, 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(u, m);
        //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;
                poz[p] = p;
                UP_heap(p);
                continue;
            }
            DOWN_heap(x);
        }
        else
            fout << val[H[1]] << '\n';
    }
    return 0;
}