Cod sursa(job #2365967)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 4 martie 2019 17:44:35
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>

using namespace std;

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

const int NMAX = 200005;

int N;
int heapSize, heap[NMAX];
int nrIns, inserted[NMAX];
int pos[NMAX];

void Insert(int val)
{
    inserted[++nrIns] = ++heapSize;
    heap[heapSize] = val;
    pos[heapSize] = nrIns;

    int p = heapSize;

    while(p > 1)
    {
        int son = p >> 1;

        if(heap[son] >= heap[p])
        {
            swap(inserted[pos[son]], inserted[pos[p]]);
            swap(pos[son], pos[p]);
            swap(heap[son], heap[p]);

            p = son;
        }
        else
            break;
    }
}

void Delete(int posDelete)
{
    swap(inserted[pos[posDelete]], inserted[pos[heapSize]]);
    swap(pos[posDelete], pos[heapSize]);
    swap(heap[posDelete], heap[heapSize]);

    heapSize--;

    int p = posDelete;

    while(p < heapSize)
    {
        int sonLeft = p << 1;
        int sonRight = p << 1 + 1;

        if(sonLeft > heapSize)
            break;

        int preferredSon;

        if(sonRight > heapSize)
            preferredSon = sonLeft;
        else if(heap[sonLeft] < heap[sonRight])
            preferredSon = sonLeft;
        else
            preferredSon = sonRight;

        if(heap[p] >= heap[preferredSon])
        {
            swap(inserted[pos[p]], inserted[pos[preferredSon]]);
            swap(pos[p], pos[preferredSon]);
            swap(heap[p], heap[preferredSon]);

            p = preferredSon;
        }
        else
            break;
    }
}

int Head()
{
    return heap[1];
}

int main()
{
    fin >> N;

    int type, x;

    for(int i = 1; i <= N; i++)
    {
        fin >> type;

        if(type == 1)
        {
            fin >> x;
            Insert(x);
        }
        else if(type == 2)
        {
            fin >> x;
            Delete(inserted[x]);
        }
        else
            fout << Head() << '\n';
    }

    return 0;
}