Cod sursa(job #2710116)

Utilizator rARES_4Popa Rares rARES_4 Data 21 februarie 2021 20:47:09
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("heapuri.in");
ofstream g("heapuri.out");
int n,c,x,heapsize;
int heap[200001],pozitii[200001],v[200001];
/// implematare heap pe cursul de pe udemy
void push(int x)
{
    heap[++heapsize] = x;
    int pos = heapsize;
    pozitii[x] = pos;
    while(heapsize>1 && v[heap[pos]] < v[heap[pos/2]])
    {
        swap(heap[pos],heap[pos/2]);
        /// dupa swap schimbam valorile atribuite
        pozitii[heap[pos]] = pos;
        pozitii[heap[pos/2]] = pos/2;
        pos/=2;
    }
}
void downHeap(int pos)
{
    int largest = pos;
    int pos1 = pos * 2;
    int pos2 = pos * 2 +1;
    if(pos1<=heapsize && v[heap[pos1]]<v[heap[largest]])
        largest = pos1;
    if(pos2 <= heapsize && v[heap[pos2]]<v[heap[largest]])
        largest = pos2;
    if(pos!=largest)
    {
        swap(heap[pos],heap[largest]);
        pozitii[heap[pos]] = pos;
        pozitii[heap[largest]] = pos;
        downHeap(largest);
    }
}
void pop(int x)
{
    int pos = pozitii[x];
    v[x] = -1;
    heap[pos] = heap[heapsize--];
    pozitii[heap[pos]] = pos;
    downHeap(pos);
}
int main()
{
    int cnt = 1;
    f >> n;
    for(int i = 1; i<=n; i++)
    {
        f >> c;
        if(c == 1)
        {
            f >> v[cnt];
            push(cnt);
            cnt++;
        }
        else if(c == 2)
        {
            f >> x;
            pop(x);
        }
        else
            g << v[heap[1]]<< '\n';
    }
}