Cod sursa(job #829372)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 5 decembrie 2012 11:16:13
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <algorithm>


#define fs (node << 1)
#define fd ((node << 1) + 1)

using namespace std;
const unsigned int INF = 1 << 31;
const int maxn = 524288 * 2;
int N; int A[524288];
unsigned int aint[maxn];
inline int min(int a, int b) {
	if(a < b) return a;
	return b;
}
void build_tree(int node, int lf, int rt) {
	if(lf == rt) {
		aint[node] = A[lf];
		return ;
	}
	int mid = (lf + rt) >> 1;
	build_tree(fs, lf, mid);
	build_tree(fd, mid + 1, rt);
	aint[node] = min(aint[fs], aint[fd]);
}
void update(int node, int lf, int rt, int pos, int val) {
	if(lf == rt) {
		aint[node] = val;
		return ;
	}
	int mid = (lf + rt) >> 1;
	if(pos <= mid) update(fs, lf, mid, pos, val);
	if(pos > mid) update(fd, mid + 1, rt, pos, val);
	aint[node] = min(aint[fs], aint[fd]);
}
void rear(int node, int lf, int rt, int val) {
	if(lf == rt) {
		aint[node] = INF;
		return ;
	}
	int mid = (lf + rt) >> 1;
	if(aint[fs] == val)
		rear(fs, lf, mid, val);
	else rear(fd, mid + 1, rt, val);
	aint[node] = min(aint[fs], aint[fd]);
}

int main() {
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);
	
	scanf("%d", &N);
	
	
	
	for(int i = 1; i <= N; ++i) {
		scanf("%d", &A[i]);
		//update(1, 1, N, i, x);
	}
	build_tree(1, 1, N) ;
	for(int i = 1; i <= N; ++i) {
		printf("%d ", aint[1]);
		rear(1, 1, N, aint[1]);
	}
	
	return 0;
}