Cod sursa(job #2286251)

Utilizator FlaviusFeteanFetean Flavius FlaviusFetean Data 19 noiembrie 2018 23:03:10
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

struct nod {int info, ord; } v[200005];
int vind[200005];

void insert(int x, int ord, int l)
{
    int i = l;
    v[i].info = x; v[i].ord = ord; vind[ord] = i;
    while(i > 1 && v[i].info < v[i/2].info){
        swap(v[i], v[i/2]);
        vind[v[i].ord] = i;
        vind[v[i/2].ord] = i/2; i = i/2;
    }
}

void erase(int x, int l)
{
    x = vind[x];
    while(x*2 + 1 <= l - 1){
        if(v[x*2].info < v[x*2 + 1].info){
            v[x] = v[x*2]; vind[v[x].ord] = x;
            x *= 2;
        }
        else{
            v[x] = v[x*2 + 1]; vind[v[x].ord] = x;
            x = x*2 + 1;
        }
    }
    if(x*2 == l - 1) v[x] = v[x*2], vind[v[x].ord] = x;
    if(x*2 > l - 1) insert(v[l - 1].info, v[l - 1].ord, x*2);
}

int main()
{
    int n, t, x, k = 0, l;
    fin >> n; l = 1;
    for(int i = 1; i <= n; i++){
        fin >> t;
        if(t == 1) fin >> x, insert(x, ++k, l), l++;
        else if(t == 2) fin >> x, erase(x, l), l--;
        else if(t == 3) fout << v[1].info <<"\n";
    }
    return 0;
}