Cod sursa(job #2312377)

Utilizator alexnigaNiga Alexandru alexniga Data 4 ianuarie 2019 19:19:27
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.58 kb
///SORTARE CU ARBORI BINARI DE INTERVALE
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

struct structura
{
    int pozitie, valoare;
}x[1000001];

void update_arb_minus1(int left, int right, int poz_arb, int poz_numar, int numar, structura x[])
{
    if (left == right)
    {
        x[poz_arb].valoare = -1;
        return;
    }
    int middle = (left + right) / 2;

    if (poz_numar <= middle)
        update_arb_minus1(left, middle, 2 * poz_arb, poz_numar, numar, x);
    else
        update_arb_minus1(middle + 1, right, 2 * poz_arb + 1, poz_numar, numar, x);

    if(x[2 * poz_arb].valoare > x[2 * poz_arb + 1].valoare)
            x[poz_arb] = x[2 * poz_arb];
    else
        x[poz_arb] = x[2 * poz_arb + 1];
}

void update_arb(int left, int right, int poz_arb, int poz_numar, int numar, structura x[])
{
    if (left == right)
    {
        x[poz_arb].valoare = numar;
        x[poz_arb].pozitie = poz_numar;
        return;
    }
    int middle = (left + right) / 2;

    if (poz_numar <= middle)
        update_arb(left, middle, 2 * poz_arb, poz_numar, numar, x);
    else
        update_arb(middle + 1, right, 2 * poz_arb + 1, poz_numar, numar, x);

    if(x[2 * poz_arb].valoare > x[2 * poz_arb + 1].valoare)
            x[poz_arb] = x[2 * poz_arb];
    else
        x[poz_arb] = x[2 * poz_arb + 1];
}

void query(int left, int right, int poz_arb, int poz_left, int poz_right, structura x[], structura &maxim)
{
    if (poz_left <= left && poz_right >= right)
        {
            if (x[poz_arb].valoare > maxim.valoare)
                {
                    maxim.valoare = x[poz_arb].valoare;
                    maxim.pozitie = x[poz_arb].pozitie;
                }
            return;
        }
    int middle = (left + right) / 2;
    if (poz_left <= middle)
        query(left, middle, 2 * poz_arb, poz_left, poz_right, x, maxim);
    if (poz_right > middle)
        query(middle + 1, right, 2 * poz_arb + 1, poz_left, poz_right, x, maxim);
}

int main()
{
    int n, m, i, numar, a, b, case_x, v[500001];
    structura maxi;

    f >> n;
    m = n;
    for (i = 1; i <= n; i++)
        {
            f >> numar;
            update_arb(1, n, 1, i, numar, x);
        }
    for (i = 1; i <= m; i++)
    {
            maxi.valoare = -1;
            query(1, n, 1, 1, n, x, maxi);
            update_arb_minus1(1, n, 1, maxi.pozitie, -1, x);
            v[m - i + 1] = maxi.valoare;
    }
    for (i = 1; i <= n; i++)
        g << v[i] << " ";
    return 0;
}