#include <algorithm>
#include <iostream>
#include <vector>

template <typename T>
std::vector<std::size_t> compute_order(const std::vector<T>& v)
{
	std::vector<std::size_t> indices(v.size());
	std::iota(indices.begin(), indices.end(), 0u);
	std::sort(indices.begin(), indices.end(), [&](int lhs, int rhs) {
        return v[lhs] < v[rhs];
    });
    std::vector<std::size_t> res(v.size());
    for (std::size_t i = 0; i != indices.size(); ++i) {
    	res[indices[i]] = i;
    }
    return res;
}

int main() {
	const auto order = compute_order<int>({40, 20, 10, 30});
	for (const auto& e : order) {
		std::cout << " " << e;
	}
}