#include <iostream>
#include <vector>
#include <list>
#include <future>
#include <chrono>
#include <cmath>

int main() {
	
	{
		std::vector<double> vin(10000000, 5.0);
		std::vector<double> vout(10000000);
		
		auto s = std::chrono::system_clock::now();
		
		for (int i = 0; i < 10000000; i++)
			vout[i] = pow(vin[i] * vin[i] / 4.0, vin[i] * vin[i] / 4.0);
			
		std::cout << (std::chrono::system_clock::now() - s).count() << std::endl;
	}
	
	{
		std::cout << std::thread::hardware_concurrency() << std::endl;
		
		std::vector<double> vin(10000000, 5.0);
		std::vector<double> vout(10000000);
		
		auto s = std::chrono::system_clock::now();
		
		std::list<std::future<void>> fs;
		
		auto f = [&vin, &vout](int i1, int i2){
			for (int i = i1; i < i2; i++)
				vout[i] = pow(vin[i] * vin[i] / 4.0, vin[i] * vin[i] / 4.0);
		};
		
		for (int i = 0; i < 10 ; i++) {
			fs.emplace_back(std::async(std::launch::async, f, i*1000000, (i+1)*1000000));
		}
		
		for (auto& f : fs) f.get();
		
		std::cout << (std::chrono::system_clock::now() - s).count() << std::endl;
	}
	
	return 0;
}