Cod sursa(job #2088247)

Utilizator MaligMamaliga cu smantana Malig Data 14 decembrie 2017 21:29:40
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>

#if 1
#define pv(x) cout<<#x<<" = "<<x<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif

using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");

#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
const int NMax = 4 * 5e5 + 50;
const unsigned inf = 4e9 + 50;

int N,M;

struct {
    unsigned idx,val;
}aint[NMax];

void update(unsigned,unsigned,unsigned,unsigned,unsigned);

int main() {
    in>>N;
    for (int i=1;i <= N;++i) {
        int val;
        in>>val;

        update(1,1,N,i,val);
    }

    for (int i=1;i <= N;++i) {
        out<<aint[1].val<<' ';
        update(1,1,N,aint[1].idx,inf);
    }

    return 0;
}

void update(unsigned node,unsigned st,unsigned dr,unsigned idx,unsigned val) {
    int fs = node<<1, ss = fs + 1;

    if (st == dr) {
        aint[node].idx = idx;
        aint[node].val = val;
        return;
    }

    unsigned mid = (st+dr)>>1;
    if (idx <= mid) {
        update(fs,st,mid,idx,val);
    }
    else {
        update(ss,mid+1,dr,idx,val);
    }

    if (aint[fs].val < aint[ss].val) {
        aint[node] = aint[fs];
    }
    else {
        aint[node] = aint[ss];
    }
}