Cod sursa(job #2882756)

Utilizator alexddAlexandru Dima alexdd Data 31 martie 2022 19:32:04
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
const int maxn = 1000005;
int pozitie[maxn];

int heap[maxn];
int cand[maxn];

int n;  /// dimensiunea heapului
int nrinserari;

void up(int nod)
{
    if(nod == 1)
        return;
    int tata = nod / 2;
    if(heap[nod] < heap[tata])
    {
        pozitie[cand[nod]] = tata;
        pozitie[cand[tata]] = nod;
        swap(heap[nod], heap[tata]);
        swap(cand[nod], cand[tata]);
        up(tata);
    }
}

void down(int nod)
{
    /// fii sunt nod * 2, nod * 2 + 1
    /// trebuie sa ii compar ca sa vad cu cine interschimb
    if(nod * 2 > n)
        return;
    int fiumin = nod * 2;
    if(nod * 2 + 1 <= n && heap[fiumin] > heap[nod * 2 + 1])
        fiumin = nod * 2 + 1;
    if(heap[nod] > heap[fiumin])
    {
        pozitie[cand[nod]] = fiumin;
        pozitie[cand[fiumin]] = nod;
        swap(heap[nod], heap[fiumin]);
        swap(cand[nod], cand[fiumin]);
        down(fiumin);
    }
}

void inserare(int val)
{
    n++;
    heap[n] = val;
    cand[n] = nrinserari;
    pozitie[nrinserari] = n;
    up(n);
}


void stergere(int x)
{
    int nod = pozitie[x];
    swap(pozitie[cand[nod]], pozitie[cand[n]]);
    swap(heap[nod], heap[n]);
    swap(cand[nod], cand[n]);
    n--;
    up(nod);
    down(nod);
}

int main()
{
    int n,a;
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>a;
        nrinserari++;
        inserare(a);
    }
    for(int i=1;i<=n;i++)
    {
        fout<<heap[1]<<" ";
        stergere(cand[1]);
    }
    /*int m;
    in >> m;
    for(int i = 1; i <= m; i++)
    {
        int op, x;
        in >> op;
        if(op == 1 || op == 2)
            in >> x;
        if(op == 1)
        {
            nrinserari++;
            inserare(x);
        }
        else if(op == 2)
            stergere(x);
        else
            out << heap[1] << "\n";
    }
    return 0;*/
}