Cod sursa(job #3131034)

Utilizator Farcasi_George_OctavianFarcasi George Octavian Farcasi_George_Octavian Data 19 mai 2023 01:32:39
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.66 kb
//
// Created by Octavian Farcasi on 18.05.2023.
//
#include<iostream>
#include<fstream>
#include<vector>
#include<map>

void heapify(std::vector<int>&v,long pozitii_heap[],int pozitie_curenta){
    int nod_stang=2*pozitie_curenta+1,nod_drept=nod_stang+1, pozitie_minim=pozitie_curenta;
    if(v.size()>nod_stang  && v[pozitie_minim]>v[nod_stang])
        pozitie_minim=nod_stang;
    if(v.size()>nod_drept && v[pozitie_minim]>v[nod_drept])
        pozitie_minim=nod_drept;
    if(pozitie_minim!=pozitie_curenta){
        std::swap(v[pozitie_curenta],v[pozitie_minim]);
        pozitii_heap[v[pozitie_curenta]]=pozitie_curenta;
        pozitii_heap[v[pozitie_minim]]=pozitie_minim;
        heapify(v,pozitii_heap,pozitie_minim);
    }
}

void inserare(std::vector<int>&v,std::vector<int>&elem,long pozitii_heap[],int valoare){
    pozitii_heap[valoare]=elem.size();
    v.push_back(valoare);
    elem.push_back(valoare);
    for(int i=v.size()/2-1;i>=0;i--)
        heapify(v,pozitii_heap,i);
}

void stergere(std::vector<int>&v, std::vector<int>&elem, long pozitii_heap[], int x){
    int index=pozitii_heap[elem[x-1]];
    std::swap(v[index],v[v.size()-1]);
    v.pop_back();
    heapify(v,pozitii_heap,index);
}

int main(){

    std::ifstream f("heapuri.in");
    std::ofstream g("heapuri.out");

    int n, operatie, valoare,ok=0; long poz_heap[1000000000];
    std::vector<int>v;                        //heap-ul
    std::vector<int>ordinea_inserarii;        //primesc o pozitie si returnez un element
    std::map<int,int>pozitii_heap;            //primesc un element si returnez o pozitie;
    
    f>>n;
    while(n>0){
        f>>operatie;
        switch (operatie) {
            case 1:
                f>>valoare;
                inserare(v,ordinea_inserarii,poz_heap,valoare);
                break;
            case 2:
                f>>valoare;
                stergere(v,ordinea_inserarii,poz_heap,valoare);
                break;
            case 3:
                if(ok) {
                    g << "\n";
                }
                g<<v[0];
                ok=1;
                break;
        }
        n--;
    }
    
    

    

//    inserare(v,ordinea_inserarii,pozitii_heap,3);
//    inserare(v,ordinea_inserarii,pozitii_heap,9);
//    inserare(v,ordinea_inserarii,pozitii_heap,2);
//    inserare(v,ordinea_inserarii,pozitii_heap,1);
//    inserare(v,ordinea_inserarii,pozitii_heap,4);
//    inserare(v,ordinea_inserarii,pozitii_heap,5);


    
//    for(auto &i:v)
//        std::cout<<i<<" ";
//    std::cout<<"\n";

//    stergere(v,ordinea_inserarii,pozitii_heap,1);
//
//    for(auto &i:v)
//        std::cout<<i<<" ";
//    std::cout<<"\n";


    f.close();
    g.close();

    return 0;
}