#include <thread>
#include <vector>
#include <functional>
#include <iostream>
#include <cassert>
template <typename Iter>
void rev(Iter from, Iter mid, Iter to)
{
const auto len = mid - from;
if (len == 0)
{
return;
}
else if (len == 1)
{
std::iter_swap(from, to - 1);
return;
}
auto left = from + ( len / 2 );
auto right = to - ( len / 2 );
auto t1 = std::thread{ [=]() { rev(from, left, to); } };
auto t2 = std::thread{ [=]() { rev(left, mid, right); } };
t1.join();
t2.join();
}
template <typename Iter>
void rev(Iter begin, Iter end)
{
const auto len = end - begin;
rev(begin, begin + (len / 2), end);
}
int main()
{
std::vector<int> v = { 1,2,3,4,5,6,7,8,9 };
rev( v.begin(), v.end() );
assert(v == (std::vector<int>{ 9,8,7,6,5,4,3,2,1 }));
std::cout << "ok\n";
}
I2luY2x1ZGUgPHRocmVhZD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCiNpbmNsdWRlIDxjYXNzZXJ0PgoKdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CnZvaWQgcmV2KEl0ZXIgZnJvbSwgSXRlciBtaWQsIEl0ZXIgdG8pCnsKCWNvbnN0IGF1dG8gbGVuID0gbWlkIC0gZnJvbTsKCglpZiAobGVuID09IDApCgl7CgkJcmV0dXJuOwoJfQoJZWxzZSBpZiAobGVuID09IDEpCgl7CgkJc3RkOjppdGVyX3N3YXAoZnJvbSwgdG8gLSAxKTsKCQlyZXR1cm47Cgl9CgoJYXV0byBsZWZ0ID0gZnJvbSArICggbGVuIC8gMiApOwoJYXV0byByaWdodCA9IHRvIC0gKCBsZW4gLyAyICk7CgoJYXV0byB0MSA9IHN0ZDo6dGhyZWFkeyBbPV0oKSB7IHJldihmcm9tLCBsZWZ0LCB0byk7IH0gfTsKCWF1dG8gdDIgPSBzdGQ6OnRocmVhZHsgWz1dKCkgeyByZXYobGVmdCwgbWlkLCByaWdodCk7IH0gfTsKCgl0MS5qb2luKCk7Cgl0Mi5qb2luKCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgp2b2lkIHJldihJdGVyIGJlZ2luLCBJdGVyIGVuZCkKewoJY29uc3QgYXV0byBsZW4gPSBlbmQgLSBiZWdpbjsKCXJldihiZWdpbiwgYmVnaW4gKyAobGVuIC8gMiksIGVuZCk7Cn0KCmludCBtYWluKCkKewoJc3RkOjp2ZWN0b3I8aW50PiB2ID0geyAxLDIsMyw0LDUsNiw3LDgsOSB9OwoJcmV2KCB2LmJlZ2luKCksIHYuZW5kKCkgKTsKCWFzc2VydCh2ID09IChzdGQ6OnZlY3RvcjxpbnQ+eyA5LDgsNyw2LDUsNCwzLDIsMSB9KSk7CgoJc3RkOjpjb3V0IDw8ICJva1xuIjsKfQ==