Cod sursa(job #2315900)

Utilizator bananamandaoneTudor Cosmin Oanea bananamandaone Data 10 ianuarie 2019 19:12:58
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
#define nmax 200005

using namespace std;

int v[nmax], heap[nmax], nheap,cnt;
int poz[nmax];

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

void heapnumber()
{
    int nr;
    fin>> v[++cnt];

    poz[cnt] = ++nheap;
    heap[nheap] = cnt;
    nr = nheap;
    while(v[heap[nr/2]] > v[heap[nr]] && nr > 1)
    {
        swap(poz[heap[nr/2]], poz[heap[nr]]);
        swap(heap[nr/2],heap[nr]);
        nr /= 2;
    }
}
//primul element e 4 : poz[1] = 2;
//al doilea element e 3: poz[2] = 1;    - heap[2]

void heapout()
{
// scot pe heap[poz[x]]
    int fiu,x;
    fin>>x;
    int p = poz[x];
    swap(poz[x], poz[heap[nheap]]);
    swap(heap[p],heap[nheap]);
    nheap--;
    while (p * 2 <= nheap)
    {

        fiu = p * 2;
        if(heap[p * 2 + 1] < heap[fiu])
            fiu = p * 2 + 1;
        swap(poz[p],poz[fiu]);
        swap(heap[p],heap[fiu]);
        p *= 2;
    }

}

void Topheap()
{
    fout<<v[heap[1]]<<"\n";
}

int main()
{
    int i,q,op;
    fin>>q;
    for  (i = 1 ; i<= q; i++)
    {
        fin>> op;
        if (op == 1)
        {
            heapnumber();
        }
        else if(op == 2)
            heapout();
        else
            Topheap();

    }

    fin.close();
    fout.close();
    return 0;
}