fn main() {
let mut input: Vec<_> = (1..10_000_000).rev().collect();
let result = {
sort_imp(&mut input);
input
};
//println!("{:?}", result);
}
fn sort_imp<T: Ord + Copy>(arr: &mut Vec<T>) {
fn swap<T: Ord + Copy>(arr: &mut Vec<T>, i: usize, j: usize) {
let t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
fn sort1<T: Ord + Copy>(arr: &mut Vec<T>, l: usize, r: usize) {
let pivot = arr[(l + r) / 2];
let mut i = l;
let mut j = r;
if r-l < 2 {
return;
}
while i < j {
while arr[i] < pivot { i += 1; }
while arr[j] > pivot { j -= 1; }
if i < j {
swap(arr, i, j);
i += 1;
j -= 1;
}
}
if l < j { sort1(arr, l, j); }
if j < r { sort1(arr, j, r); }
}
let len = arr.len() - 1;
sort1(arr, 0, len);
}
Zm4gbWFpbigpIHsKICAgIGxldCBtdXQgaW5wdXQ6IFZlYzxfPiA9ICgxLi4xMF8wMDBfMDAwKS5yZXYoKS5jb2xsZWN0KCk7CiAgICBsZXQgcmVzdWx0ID0gewogICAgICAgIHNvcnRfaW1wKCZtdXQgaW5wdXQpOwogICAgICAgIGlucHV0CiAgICB9OwogICAgLy9wcmludGxuISgiezo/fSIsIHJlc3VsdCk7Cn0KCmZuIHNvcnRfaW1wPFQ6IE9yZCArIENvcHk+KGFycjogJm11dCBWZWM8VD4pIHsKICAgIGZuIHN3YXA8VDogT3JkICsgQ29weT4oYXJyOiAmbXV0IFZlYzxUPiwgaTogdXNpemUsIGo6IHVzaXplKSB7CiAgICAgICAgbGV0IHQgPSBhcnJbaV07CiAgICAgICAgYXJyW2ldID0gYXJyW2pdOwogICAgICAgIGFycltqXSA9IHQ7CiAgICB9CgogICAgZm4gc29ydDE8VDogT3JkICsgQ29weT4oYXJyOiAmbXV0IFZlYzxUPiwgbDogdXNpemUsIHI6IHVzaXplKSB7CiAgICAgICAgbGV0IHBpdm90ID0gYXJyWyhsICsgcikgLyAyXTsKICAgICAgICBsZXQgbXV0IGkgPSBsOwogICAgICAgIGxldCBtdXQgaiA9IHI7CgkJaWYgIHItbCA8IDIgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHdoaWxlIGkgPCBqIHsKICAgICAgICAgICAgd2hpbGUgYXJyW2ldIDwgcGl2b3QgeyBpICs9IDE7IH0KICAgICAgICAgICAgd2hpbGUgYXJyW2pdID4gcGl2b3QgeyBqIC09IDE7IH0KICAgICAgICAgICAgaWYgaSA8IGogewogICAgICAgICAgICAgICAgc3dhcChhcnIsIGksIGopOwogICAgICAgICAgICAgICAgaSArPSAxOwogICAgICAgICAgICAgICAgaiAtPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIGwgPCBqIHsgc29ydDEoYXJyLCBsLCBqKTsgfQogICAgICAgIGlmIGogPCByIHsgc29ydDEoYXJyLCBqLCByKTsgfQogICAgfQogICAgbGV0IGxlbiA9IGFyci5sZW4oKSAtIDE7CiAgICBzb3J0MShhcnIsIDAsIGxlbik7Cn0K