Cod sursa(job #2882733)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 31 martie 2022 19:13:42
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int maxn = 200005;
int pozitie[maxn];

struct per {
    int val;
    int poz;
};

per heap[maxn];
int n;  /// dimensiunea heapului
int nrinserari;

void up(int nod)
{
    if(nod == 1)
        return;
    int tata = nod / 2;
    if(heap[nod].val < heap[tata].val)
    {
        pozitie[heap[nod].poz] = tata;
        pozitie[heap[tata].poz] = nod;
        swap(heap[nod], heap[tata]);
        up(tata);
    }
}

void down(int nod)
{
    /// fii sunt nod * 2, nod * 2 + 1
    /// trebuie sa ii compar ca sa vad cu cine interschimb
    if(nod * 2 > n)
        return;
    int fiumin = nod * 2;
    if(nod * 2 + 1 <= n && heap[fiumin].val > heap[nod * 2 + 1].val)
        fiumin = nod * 2 + 1;
    if(heap[nod].val > heap[fiumin].val)
    {
        pozitie[heap[nod].poz] = fiumin;
        pozitie[heap[fiumin].poz] = nod;
        swap(heap[nod], heap[fiumin]);
        down(fiumin);
    }
}

void inserare(int val)
{
    n++;
    heap[n] = {val, nrinserari};
    pozitie[nrinserari] = n;
    up(n);
}


void stergere(int x)
{
    int nod = pozitie[x];
    swap(pozitie[heap[nod].poz], pozitie[heap[n].poz]);
    swap(heap[nod], heap[n]);
    n--;
    up(nod);
    down(nod);
}

int main()
{
    int m;
    in >> m;
    for(int i = 1; i <= m; i++)
    {
        int op, x;
        in >> op;
        if(op == 1 || op == 2)
            in >> x;
        if(op == 1)
        {
            nrinserari++;
            inserare(x);
        }
        else if(op == 2)
            stergere(x);
        else
            out << heap[1].val << "\n";
    }
    return 0;
}