Cod sursa(job #3129111)

Utilizator arobyRobert Acsente aroby Data 12 mai 2023 17:27:18
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
class Heap
{
public:
    vector<int> heap;
    void push(int val)
    {
        heap.push_back(val);
        sift_up(heap.size() - 1);
    }
    int pop()
    {
        if (heap.size() == 0)
            return 0;
        else if (heap.size() == 1)
        {
            int aux = heap.back();
            heap.pop_back();
            return aux;
        }
        int val_min = heap[0];
        int aux = heap.back();
        heap.pop_back();
        heap[0] = aux;
        sift_down(0);
        return val_min;
    }
    void sift_down(int i)
    {
        while (2 * i + 1 < heap.size())
        {
            int l_i = 2 * i + 1;
            int r_i = 2 * i + 2;
            int min_child = l_i;
            if (r_i < heap.size() && heap[r_i] < heap[l_i])
                min_child = r_i;
            if (heap[i] > heap[min_child])
            {
                swap(heap[i], heap[min_child]);
                i = min_child;
            }
            else
                break;
        }
    }
    void sift_up(int i)
    {
        while (i > 0)
        {
            int parent_i = (i - 1) / 2;
            if (heap[parent_i] > heap[i])
            {
                swap(heap[parent_i], heap[i]);
                i = parent_i;
            }
            else
                break;
        }
    }
    void remove(int x)
    {   int i;
        for(i=0;i<heap.size();i++)
            if(heap[i]==x)
            break;
        swap(heap[i],heap.back());
        heap.pop_back();
        sift_down(i);
    }
};
vector <int> v;
int main()
{
    Heap my_heap;
    int n;
    in>>n;
    for(int i=0;i<n;i++)
    {   int x,y;
        in>>x;

        if(x==1)
        { in>>y;
            v.push_back(y);
            my_heap.push(y);}
            else if(x==2) 
            {
                in>>y;
                my_heap.remove(v[y]);
            }
        else out<<my_heap.pop()<<endl;
    }
}