Cod sursa(job #2154249)

Utilizator mrhammerCiocan Cosmin mrhammer Data 6 martie 2018 20:18:44
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int n;
std::vector<int> heap;
std::vector<int> stack_order;
void min_heapify(int y)
{
    int parent = (y-1)/2;
    if(heap[y] < heap[parent])
    {
        int aux = heap[y];
        heap[y] = heap[parent];
        heap[parent] = aux;
        if(parent != 0) min_heapify(parent);
    }
}
void build_heap(int x)
{
    heap.push_back(x);
    if(heap.size()-1 != 0) min_heapify(heap.size()-1);
}
void restore_heap(int x)
{
    int ch1 = 2*x+1;
    int ch2 = 2*x+2;
    int m,m_pos;
    if(heap[ch1] < heap[ch2]) m=heap[ch1],m_pos = ch1;
    else m=heap[ch2],m_pos = ch2;
    if(heap[x] > m)
    {
        int aux = heap[x];
        heap[x] = m;
        heap[m_pos] = aux;
        restore_heap(m_pos);
    }
}
void search_and_delete(int x)
{
    int del = stack_order[x-1];
    cout<<del<<" ";
    int i = 0;
    while(heap[i] != del) i++;
    heap[i] = heap[heap.size()-1];
    heap.pop_back();
    if(i != 0 && i != heap.size()) restore_heap(i);
}
void print_heap()
{
    for(int i=0;i<heap.size();i++)
    {
        cout<<heap[i]<<" ";
    }
    cout<<"\n";
}
int main()
{
    fin>>n;
    for(int i=0;i<n;i++)
    {
        int k1;
        int k2;
        fin>>k1;
        if(k1 == 1)
        {
            fin>>k2;
            build_heap(k2);
            stack_order.push_back(k2);
        }
        else if(k1 == 2)
        {
            fin>>k2;
            search_and_delete(k2);
            print_heap();
        }
        else if(k1 == 3)
        {
            //cout<<heap[0]<<"\n";
            //print_heap();
        }
    }
}