Cod sursa(job #2925406)

Utilizator juincPopescu Marian juinc Data 15 octombrie 2022 10:28:27
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

int elemCount = 1;

void insert(std::vector<int>& heap, int elem,std::vector<int>& ord){
    if (heap.size()==0){

        heap.push_back(elem);
        ord[heap.size()-1] = elemCount;
        elemCount++;
        return;
    }
    heap.push_back(elem);
    ord[heap.size()-1] = elemCount;
    elemCount++;
    for(int i = (heap.size()-1); i >= 0 ; i = i/2){
        if(heap[i] > heap[i/2]){
            int temp = heap[i/2];
            int temp2 = ord[i/2];
            heap[i/2] = heap[i];
            ord[i/2] = ord[i];
            heap[i] = temp;
            ord[i] = temp2;
        }else{
            return;
        }
    }
}

void del(std::vector<int>& heap, int pos, std::vector<int>& ord){
    if(heap.size() == 0){
        return;
    }
    if(heap.size() == 1){
        heap.pop_back();
        ord.pop_back();
        return;
    }
    auto index = (ord.begin() - std::find(ord.begin(),ord.end(),pos))*(-1);
    heap[index] = heap[heap.size()-1];
    ord[index] = ord[heap.size()-1];
    heap.pop_back();
    ord[heap.size()] = 0;
    for(int i = pos; i < heap.size(); i = i*2){
        if(heap[i] < heap[i*2]){
            int temp = heap[i*2];
            int temp2 = ord[i*2];
            heap[i*2] = heap[i];
            ord[i*2] = ord[i];
            heap[i] = temp;
            ord[i] = temp2;
        }
        if(heap[i] < heap[i*2 + 1]){
            int temp = heap[i*2 + 1];
            int temp2 = ord[i*2 + 1];
            heap[i*2 + 1] = heap[i];
            ord[i*2 + 1] = ord[i];
            heap[i] = temp;
            ord[i] = temp2;
        }
    }
}

int min(std::vector<int>& heap){
    return heap[heap.size()-1];
}

int main(){
    std::ifstream fin("heapuri.in");
    std::ofstream fout("heapuri.out");

    int n;
    fin >> n;
    std::vector<int> heap;
    std::vector<int> ord(n,NULL);

    while(!fin.eof()){
        int op;
        fin >> op;

        switch(op){
            case 1:
                int elem;
                fin >> elem;
                insert(heap,elem,ord);
                break;
            case 2:
                int pos;
                fin >> pos;
                del(heap,pos,ord);
                break;
            case 3:
                fout << min(heap) << std::endl;
                break;

        }
    }

    fin.close();
    fout.close();

    return 0;
}