Cod sursa(job #2076010)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 25 noiembrie 2017 22:36:38
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>

using namespace std;

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

int n,i,op,x,contor,v[200001],w[200001],poz[200001],c,p,k,nr;

int main()
{
    fin >> n;
    for (i=1; i<=n; i++)
    {
        fin >> op;
        if (op == 1)
        {
            fin >> x;
            contor++;
            v[++k] = x;///heap
            w[k] = contor;///poz in care au fost puse nr
            poz[contor] = k;///poz din heap a unui elem
            c = k;
            p = k/2;
            while (p >= 0)
                if (v[c] < v[p])
                {
                    swap(v[c], v[p]);
                    swap(w[c], w[p]);
                    poz[w[p]] = p;
                    poz[w[c]] = c;
                    c = p;
                    p /= 2;
                }
                else
                    break;
        }
        if (op == 2)
        {
            fin >> x;
            nr = poz[x];
            c = nr;
            p = nr/2;
            v[nr] = v[k];
            w[nr] = w[k];
            poz[w[nr]] = poz[w[k]];
            k--;
            if (v[c] < v[p])
                while (p >= 0)
                    if (v[c] < v[p])
                    {
                        swap(v[c], v[p]);
                        swap(w[c], w[p]);
                        poz[w[p]] = p;
                        poz[w[c]] = c;
                        c = p;
                        p /= 2;
                    }
                    else
                        break;
            else
            {
                c = 2*nr;
                p = nr;
                while (c <= k)
                {
                    if (c+1 <= k && v[c+1] < v[c])
                        c++;
                    swap(v[c], v[p]);
                    swap(w[c], w[p]);
                    poz[w[p]] = p;
                    poz[w[c]] = c;
                    p = c;
                    c *= 2;
                }
            }
        }
        if (op == 3)
            fout << v[1] << "\n";
    }
    return 0;
}