Cod sursa(job #2108007)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 17 ianuarie 2018 20:41:22
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

const int dim = 500005;

unsigned int v[dim], seg_tree[4*dim];

void build(int node, int lef, int rig) {
    if (lef == rig) {
        seg_tree[node] = lef;
        return;
    }

    int mid = (lef + rig) / 2;
    build(2*node, lef, mid);
    build(2*node+1, mid+1, rig);

    seg_tree[node] = (v[seg_tree[2*node]] <= v[seg_tree[2*node+1]] ? seg_tree[2*node] : seg_tree[2*node+1]);
}

void del(int node, int lef, int rig, int pos) {
    if (lef == rig) {
        seg_tree[node] = 0;
        return;
    }

    int mid = (lef + rig) / 2;
    if (mid >= pos)
        del(2*node, lef, mid, pos);
    else
        del(2*node + 1, mid+1, rig, pos);

    seg_tree[node] = (v[seg_tree[2*node]] <= v[seg_tree[2*node+1]] ? seg_tree[2*node] : seg_tree[2*node+1]);
}

void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> v[i];

    build(1, 1, n);

    v[0] = -1;
    for (int i = n; i; --i) {
        int pos = seg_tree[1];
        cout << v[pos] << ' ';
        del(1, 1, n, pos);
    }
    cout << endl;
}

int main() {
    assert(freopen("algsort.in", "r", stdin));
    assert(freopen("algsort.out", "w", stdout));
    cin.tie(0);
    ios_base::sync_with_stdio(false);

    solve();

    return 0;
}