Cod sursa(job #1826562)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 10 decembrie 2016 16:57:03
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
//Arbori de intervale - Sortare

#include <fstream>

using namespace std;

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

#define DMAX 500001
#define infinit ((1LL << 32) - 1)

long long N;
long long v[DMAX];
long long ArbInt[DMAX*4];

void update(int nod, int st, int dr, int poz, int val) {
    if(st == dr) {
        ArbInt[nod] = val;
        return;
    }

    int mid = (st + dr)/2;
    if(poz <= mid)
        update(2*nod, st, mid, poz, val);
    else
        update(2*nod + 1, mid + 1, dr, poz, val);

    ArbInt[nod] = min(ArbInt[2*nod], ArbInt[2*nod + 1]);
}

/*
int query(int nod, int st, int dr, int val) {
    int mid;
    while(st != dr) {
        mid = (st + dr)/2;
        if(ArbInt[2*nod] == val) {
            nod = 2*nod;
            dr = mid;
        }
        else if(ArbInt[2*nod + 1] == val) {
            nod = 2*nod + 1;
            st = mid + 1;
        }
    }
}
*/
int main()
{
    long long i;
    long long l, r, m, node;

    fin>>N;
    for(i = 1 ; i <= N ; i++) {
        fin>>v[i];
        update(1, 1, N, i, v[i]);
    }

    for(i = 1 ; i <= N ; i++) {
        fout<<ArbInt[1]<<" ";
        l = 1, r = N, node = 1;
        while(l != r) {
            m = (l + r)/2;
            if(ArbInt[2*node] == ArbInt[1]) {
                node *= 2;
                r = m;
            }
            else {
                node = 2*node + 1;
                l = m + 1;
            }
        }
        update(1, 1, N, l, INT_MAX);
    }

    fin.close();
    fout.close();

    return 0;
}