Cod sursa(job #2744586)

Utilizator Dennis_SoareDennis Soare Dennis_Soare Data 24 aprilie 2021 21:08:38
Problema Heapuri cu reuniune Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.42 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("mergeheap.in");
ofstream out("mergeheap.out");

vector<int> heap[101];

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

void coboara(int nr_heap, int poz)
{
    if(poz*2+1 >= (int)heap[nr_heap].size())
        return;
    int fiu_st = heap[nr_heap][poz*2+1];
    int fiu_dr = heap[nr_heap][poz*2+2];
    if((poz*2+2 == (int)heap[nr_heap].size()) || fiu_st > fiu_dr)
    {
        if(fiu_st > heap[nr_heap][poz])
        {
            swap(heap[nr_heap][poz], heap[nr_heap][poz*2+1]);
            coboara(nr_heap, poz*2+1);
            return;
        }
        else{
            return;
        }
    }
    else
    {
        if(fiu_dr > heap[nr_heap][poz])
        {
            swap(heap[nr_heap][poz], heap[nr_heap][poz*2+2]);
            coboara(nr_heap, poz*2+2);
            return;
        }
        else{
            return;
        }
    }
}

void insert_heap(int nr_heap, int x)
{
    heap[nr_heap].push_back(x);
    urca(nr_heap, heap[nr_heap].size()-1);
}

void pop(int nr_heap)
{
    if(heap[nr_heap].size()==0)
        return;
    out<<heap[nr_heap][0]<<'\n';
    heap[nr_heap][0] = heap[nr_heap][heap[nr_heap].size()-1];
    heap[nr_heap].pop_back();
    coboara(nr_heap, 0);
    return;
}

void operatie1()
{
    int nr_heap, nr;
    in>>nr_heap>>nr;
    insert_heap(nr_heap, nr);
}

void operatie2()
{
    int nr_heap;
    in>>nr_heap;
    pop(nr_heap);
}

void operatie3()
{
    int a, b;
    in>>a>>b;
    for(int i=0; i<(int)heap[b].size(); i++)
    {
        insert_heap(a, heap[b][i]);
        heap[b].clear();
    }
}

int main()
{
    int n, q;
    in>>n>>q;
    for(int i=0; i<q; i++)
    {
        int tip_op;
        in>>tip_op;
        switch(tip_op)
        {
        case 1:
            {
                operatie1();
                break;
            }
        case 2:
            {
                operatie2();
                break;
            }
        case 3:
            {
                operatie3();
                break;
            }
        default:
            break;
        }
    }
    return 0;
}