#include <iostream>
#include <thread>
#include <vector>
#include <numeric>
#include <future>
#include <algorithm>

int sum(const int * a, const int * b)
{
        std::cout << std::this_thread::get_id() << '\n';

        auto distance = b-a;
        if(distance < 5) // willkuerliche Grenze
                return std::accumulate(a,b,0);

        const int * half = a + distance/2;

        auto fut_left = std::async(sum, a, half);
        auto right = sum(half, b);

        return fut_left.get() + right;
}

int main()
{
        std::vector<int> vec(256);
        std::iota(vec.begin(), vec.end(), 0);
        std::cout << sum(vec.data(), vec.data()+256) << '\n';
}
