#define bool int #define true 1 #define false 0 #define _template_func_def(T, func) T_DEFINE_##func(T) #define _template_func(T, func) T_##func##__##T #define SORT_PREDICATE(type, name) bool name(type a, type b) #define SORT_SWAP(type, a, b) \ { \ const type _BLOCK_T = a; \ a = b; \ b = _BLOCK_T; \ } #define T_DEFINE_less(T) \ SORT_PREDICATE(T, T_less__##T) { return a < b; } #define T_DEFINE_greater(T) \ SORT_PREDICATE(T, T_greater__##T) { return a > b; } #define T_DEFINE_sort(T) \ void T_sort__##T(T *start, const T *end, bool (*predicate)(T, T)) { \ T *i, *j; \ for (i = start; i < end; i++) { \ for (j = i; j < end; j++) { \ if (predicate(*i, *j)) { \ SORT_SWAP(T, *i, *j); \ } \ } \ } \ } #define T_DEFINE_sort_default(T) \ void T_sort_default__##T(T *start, const T *end) { \ T_sort__##T(start, end, _template_func(T, less)); \ } #define T_DEFINE_sort_init(T) \ _template_func_def(T, less); \ _template_func_def(T, greater); \ _template_func_def(T, sort); \ _template_func_def(T, sort_default); #define for_i(i, range, inner) \ { \ int i; \ for (i = 0; i < range; i++) \ inner; \ } T_DEFINE_sort_init(int); #include int main() { int n, a[301] = {0}; scanf("%d", &n); for_i(i, n, scanf("%d", a + i)); _template_func(int, sort)(a, a + n, _template_func(int, greater)); for_i(i, n, printf("%d ", a[i])); return 0; }