Cod sursa(job #2184047)

Utilizator alextodoranTodoran Alexandru Raul alextodoran Data 23 martie 2018 17:57:46
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

#define NM 200002

using namespace std;

int n, h[NM], m, o[NM];
long long v[NM];

void fixinsert ()
{
    int p = 0, k = m;
    while((1 << p) < k)
        p++;
    p--;
    while(v[h[k]] < v[h[k - (1 << p)]])
    {
        o[h[k]] = k - (1 << p);
        o[h[k - (1 << p)]] = k;
        swap(h[k], h[k - (1 << p)]);
        k -= (1 << p);
        p--;
    }
}

void fixdelete (int k)
{
    o[h[m]] = k;
    h[k] = h[m];
    m--;
    int p = 0;
    while((1 << p) < k)
        p++;
    while(k + (1 << p) <= m && v[h[k]] > v[h[k + (1 << p)]])
    {
        o[h[k]] = k + (1 << p);
        o[h[k + (1 << p)]] = k;
        swap(h[k], h[k + (1 << p)]);
        k += (1 << p);
        p++;
    }
}

int main()
{
    ifstream fin ("heapuri.in");
    ofstream fout ("heapuri.out");
    fin >> n;
    for(int i = 1, k = 0; i <= n; i++)
    {
        int op;
        fin >> op;
        if(op == 3)
            fout << v[h[1]] << "\n";
        else if(op == 1)
        {
            k++;
            fin >> v[k];
            m++;
            o[k] = m;
            h[m] = k;
            fixinsert();
        }
        else if(op == 2)
        {
            int x;
            fin >> x;
            fixdelete(o[x]);
        }
        /*
        for(int i = 1; i <= m; i++)
            fout << v[h[i]] << " ";
        fout << "\n";*/
    }
    return 0;
}