Cod sursa(job #2514800)

Utilizator mariasmmskklns mariasmm Data 26 decembrie 2019 20:38:02
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

int cautare_heap(vector< int> v,int element)
{
    queue<int> q;
    q.push(0);
    bool gasit=false;
    while (!q.empty())
    {
        int poz=q.front();
        int numar=v[poz];
        q.pop();
        if (numar==element)
            return poz;
        if (numar<element)
        {
        if (poz*2+1<v.size()-1)
            q.push(poz*2+1);
        if (poz*2+2<v.size()-1)
            q.push(poz*2+2);
        }
    }
}

void stergere(vector <int> &v, vector <int> &crono, int pozitie)
{
    int element=crono[pozitie-1];
    pozitie=cautare_heap(v, element);
    int l=v.size()-1;
    swap (v[pozitie], v[l]);
    l--;
    v.pop_back();
    bool heap=false;
    int poz=pozitie*2+1;
    while (poz<=l && !heap)
    {
        if (poz+1<=l&&v[poz]>v[poz+1])
            poz++;
        if (v[poz]<v[pozitie])
            swap (v[poz], v[pozitie]);
        else
            heap=true;

    }
}

void adaugare(vector<int> &v, vector <int> &crono, int element)
{
    crono.push_back(element);
    v.push_back(element);
    int pozitie=v.size()-1;
    while (pozitie && v[pozitie]<v[pozitie/2])
    {
        swap(v[pozitie], v[pozitie/2]);
        pozitie/=2;
    }
}


int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int nr_operatii;
    vector <int> v, crono;
    f>>nr_operatii;
    for (int i=0; i<nr_operatii; i++)
    {
        int cod_operatie;
        f>>cod_operatie;
        switch (cod_operatie)
        {
        case 1:
            int element;
            f>>element;
            adaugare(v, crono, element);
            break;
        case 2:
            int pozitie;
            f>>pozitie;
            stergere(v, crono, pozitie);
            break;
        default:
            g<<v[0]<<"\n";
            break;
        }
    }
    return 0;
}