Cod sursa(job #2293293)

Utilizator IordachescuAncaFMI Iordachescu Anca Mihaela IordachescuAnca Data 30 noiembrie 2018 19:20:08
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include<fstream>
#define NMAX 200006

using namespace std;

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

int val[NMAX], poz[NMAX], heap[NMAX];
int n, i, digit, value, position, nr, nh;

int leftson(int i)
{
    return 2*i;
}

int rightson(int i)
{
    return 2*i+1;
}

int parent(int i)
{
    return i/2;
}

void heapup(int i)
{
    int vmin = i;
    int p = parent(i);
    if (p >= 1 && val[heap[p]] > val[heap[vmin]])
    {
        vmin = p;
    }

    if (vmin != i)
    {
        poz[heap[i]] = vmin;
        poz[heap[vmin]] = i;
        swap(heap[i], heap[vmin]);
        heapup(vmin);
    }
}

void heapdown(int i)
{
    int vmax = i;
    int l = leftson(i);
    int r = rightson(i);

    if (l <= nh && val[heap[l]] < val[heap[vmax]])
    {
        vmax = l;
    }

    if (r <= nh && val[heap[r]] < val[heap[vmax]])
    {
        vmax = r;
    }

    if (vmax != i)
    {
        poz[heap[vmax]] = i;
        poz[heap[i]] = vmax;
        swap(heap[i], heap[vmax]);
        heapdown(vmax);
    }
}
void deletex(int i)
{
    heap[i] = heap[nh];
    poz[heap[i]] = i;
    nh--;
    if (i >= 2 && val[heap[parent(i)]] > val[heap[i]])
    {
        heapup(i);
    }
    else
    {
        heapdown(i);
    }
}
int main()
{
    fin >> n;

    int nr = 0;
    int nh = 0;

    for (i = 1; i <= n; i++)
    {
        fin >> digit;

        if (digit == 1)
        {
            fin >> value;

            nr++;
            nh++;
            val[nr] = value;
            poz[nr] = nh;
            heap[nh] = nr;

            heapup(nh);
        }

        if (digit == 2)
        {
            fin >> position;

            deletex(poz[position]);
        }

        if (digit == 3)
        {
            fout << val[heap[1]] << "\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}