Cod sursa(job #2893243)

Utilizator mirceaspPetcu Mircea mirceasp Data 25 aprilie 2022 15:40:39
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.61 kb
#include <fstream>
#include <vector>
using namespace std;

struct nod{
    long long valoare;
    long long pozitie;
    long long introdus;
    long long get_pozitie(long long i){if(i == introdus) return pozitie;}
    nod(long long v,long long poz,long long i){valoare=v;pozitie=poz;introdus = i;}
};
vector <nod> heap;
long long i;
long long introdus = 1;
void urca(long long poz)
{
    while (poz)
    {
        if(heap[(poz-1)/2].valoare>heap[poz].valoare) {
            swap(heap[(poz - 1) / 2].valoare, heap[poz].valoare);
            swap(heap[(poz - 1) / 2].introdus, heap[poz].introdus);
            poz = (poz-1)/2;
        }
        else
            break;
    }
}
void coboara(long long poz) {

    if (poz * 2 + 1 >= heap.size())
        return;
    long long fiu_st = heap[poz * 2 + 1].valoare;
    if ((poz * 2 + 2 == heap.size()) || fiu_st < heap[poz * 2 + 2].valoare) {
        if (fiu_st < heap[poz].valoare) {
            swap(heap[poz].valoare, heap[poz * 2 + 1].valoare);
            swap(heap[poz].introdus, heap[poz * 2 + 1].introdus);
            coboara(poz * 2 + 1);
            return;
        } else {
            return;
        }
    } else {
        if (heap[poz * 2 + 2].valoare < heap[poz].valoare) {
            swap(heap[poz].valoare, heap[poz * 2 + 2].valoare);
            swap(heap[poz].introdus, heap[poz * 2 + 2].introdus);
            coboara(poz * 2 + 2);
            return;
        } else {
            return;
        }
    }
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    long long n,op,nr,poz;
    f>>n;
    long long k = 0;
    for(i = 1;i<=n;i++) {
        f >> op;
        switch (op) {
            case 1: {
                f >> nr;
                nod nd(nr,k,introdus);
                heap.push_back(nd);
                urca(k);
                introdus++;
                k++;
                break;
            }

            case 2: {
                f >> poz;
                long long j;
                k--;
                for(j = 0;j<heap.size();j++)
                    if(heap[j].introdus == poz)
                        break;
                heap[j].valoare = heap[heap.size() - 1].valoare;
                heap[j].introdus = heap[heap.size() - 1].introdus;
                heap.pop_back();
                urca(heap[j].pozitie);
                coboara(heap[j].pozitie);
                break;
            }
            case 3: {
                g << heap[0].valoare << '\n';
                break;
            }
        }
    }
    f.close();
    g.close();
    return 0;
}