Cod sursa(job #1957149)

Utilizator Train1Train1 Train1 Data 7 aprilie 2017 12:57:20
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#define MaxN 200001
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, x, y, heap[MaxN], pos[MaxN], v[MaxN], nr = 0, k = 0;
void schimba(int node, int P) {
    int aux = heap[P];
    heap[P] = heap[node];
    heap[node] = aux;

    aux = pos[P];
    pos[P] = pos[node];
    pos[node] = aux;
}
void solve(int node) {
    int P = node / 2;
    while(v[heap[P]] > v[heap[node]] && P > 0) {
        schimba(node, P);
        node = P;
        P = node / 2;
    }
}
void sterge(int node) {
    node = heap[pos[node]];
    if(2 * node > nr) {
        heap[node] = 0;
        pos[node] = 0;
        nr--;
        return;
    }
    schimba(nr, node);

    heap[nr] = 0;
    pos[nr] = 0;
    nr--;


    while(true) {
        int stanga = 2 * node;
        int dreapta = stanga + 1;
        if(stanga > nr)
            break;
        else if(dreapta > nr) {
            if(v[heap[stanga]] < v[heap[node]]) {
                schimba(stanga, node);
                node = stanga;
            }
            break;
        }
        else if(v[heap[stanga]] < v[heap[dreapta]] && v[heap[stanga]] < v[heap[node]]) {
            schimba(stanga, node);
            node = stanga;
        } else if(v[heap[stanga]] > v[heap[dreapta]] && v[heap[dreapta]] < v[heap[node]]){
            schimba(dreapta, node);
            node = dreapta;
        }
    }
}
int main()
{
    fin>>n;
    //heap[0] = -1;
    //nr - nr elemente in heap
    //k - numar elemente introduse
    for(int i = 1; i <= n; i++) {
        fin>>x;
        if(x == 1) {
            nr++; k++;
            fin>>v[k];
            pos[k] = nr;
            heap[nr] = k;
            solve(nr); // sau k
        } else if(x == 2) {
            fin>>y;
            sterge(y);
        } else {
            fout<<v[heap[1]]<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}