Cod sursa(job #2107227)

Utilizator karakter98Irimia Robert karakter98 Data 16 ianuarie 2018 21:06:42
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <algorithm>
#include <climits>
#include <fstream>
using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

int arb[2000001];
int n;
int V[500000];

int queryTree()
{
    int node = 2;
    while(node < 2000000 && (arb[node] || arb[node + 1]))
    {
        if(arb[node] == arb[1])
            node *= 2;

        else if(arb[node + 1] == arb[1])
            node = (node + 1) * 2;
    }
    node /= 2;
    if(arb[node] == arb[1])
        return node;
    else if(arb[node] == arb[1])
        return node + 1;
    return 1;
}

void insertTree(int node, int x, int pos, int left, int right)
{
    if(left == pos && right == pos)
        arb[node] = x;
    else if(left > pos || right < pos)
        return;
    else{
        int mij = (left + right) / 2;
        insertTree(node * 2, x, pos, left, mij);
        insertTree(node * 2 + 1, x, pos, mij + 1, right);
        arb[node] = min(arb[node * 2], arb[node * 2 + 1]);
    }
}

int main()
{
    fin >> n;
    for(int i = 0; i < n; ++i)
    {
        fin >> V[i];
        insertTree(1, V[i], i + 1, 1, n);
    }

    for(int i = 0; i < n; ++i)
    {
        fout << arb[1] << ' ';
        int aux = queryTree();

        arb[aux] = INT_MAX;
        aux /= 2;

        while(aux)
        {
            arb[aux] = min(arb[aux * 2], arb[aux * 2 + 1]);
            aux /= 2;
        }
    }

    return 0;
}