Cod sursa(job #2905533)

Utilizator mirceaspPetcu Mircea mirceasp Data 22 mai 2022 12:46:35
Problema Heapuri cu reuniune Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include<fstream>
#include <vector>
using namespace std;
ifstream f("mergeheap.in");
ofstream g("mergeheap.out");
class Heap {
    vector<long long> heap;
public:


    void urca(long long poz) {
        while (poz) {
            if (heap[(poz - 1) / 2] < heap[poz]) {
                swap(heap[poz], heap[(poz - 1) / 2]);
                poz = (poz - 1) / 2;
            } else
                break;
        }
    }

    void coboara(long long poz) {
        while (poz * 2 + 1 < heap.size()) {
            if (poz * 2 + 2 < heap.size()) {
                if (heap[poz * 2 + 2] > heap[poz * 2 + 1]) {
                    swap(heap[poz * 2 + 2], heap[poz]);
                    poz = poz * 2 + 2;
                } else {
                    swap(heap[poz * 2 + 1], heap[poz]);
                    poz = poz * 2 + 1;
                }
            } else if (heap[poz * 2 + 1] > heap[poz]) {
                swap(heap[poz * 2 + 1], heap[poz]);
                poz = poz * 2 + 1;
            }
        }
    }
    long long get_max() const{return heap[0];}
    long long get_size() const{return heap.size()-1;}
    void baga(long long x)
    {
        heap.push_back(x);
        urca(get_size());
    }
    void scoate()
    {
        heap[0] = heap[get_size()];
        heap.pop_back();
        coboara(0);
    }
    vector<long long > get_heap(){return heap;}
    void heapify(Heap h)
    {
        for(auto i = h.get_size();i>=0;i--)
        {
            baga(h.get_heap()[i]);
        }
        h.get_heap().clear();
    }
};
int main()
{
    long long n,q,op,m,x,a,b;
   f>>n>>q;
   Heap v[n+1];
   for(auto i = 0;i<q;i++) {
       f >> op;
       switch (op) {
           case 1: {
               f >> m >> x;
               v[m].baga(x);
               break;
           }
           case 2:
           {
               f>>m;
               g<<v[m].get_max()<<'\n';
               v[m].scoate();
               break;
           }
           case 3:
           {
               f>>a>>b;
               v[a].heapify(v[b]);
               break;
           }
       }
   }
   f.close();g.close();
    return 0;

}