Cod sursa(job #2233334)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 22 august 2018 22:37:08
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

class Heap
{
    private :
        int sz=0;
        int a[500005];
        inline int Dad(int nod) {return nod/2;}
        inline int Left(int nod) {return 2*nod;}
        inline int Right(int nod) {return 2*nod+1;}
    public :
        inline int Size() {return sz;}
        inline int GetMin() {return a[1];}
        inline void Insert(int value)
        {
            a[++sz]=value;
            int nod=sz;
            while(nod>1 && a[Dad(nod)]>=a[nod])
            {
                swap(a[Dad(nod)],a[nod]);
                nod=Dad(nod);
            }
        }
        inline void Rebuild(int nod)
        {
            int l=Left(nod);
            int r=Right(nod);
            int id_min=nod;
            if(l<=sz && a[l]<a[id_min])
                id_min=l;
            if(r<=sz && a[r]<a[id_min])
                id_min=r;
            if(id_min!=nod)
            {
                swap(a[nod],a[id_min]);
                Rebuild(id_min);
            }
        }
        inline void EraseMin()
        {
            if(sz==0)
                return;
            swap(a[sz],a[1]);
            sz--;
            Rebuild(1);
        }
};

Heap my_heap;

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        my_heap.Insert(x);
    }
    for(int i=1;i<=n;i++)
    {
        cout<<my_heap.GetMin()<<" ";
        my_heap.EraseMin();
    }
    cout<<"\n";
    return 0;
}