#include <iostream>
#include <algorithm>
#include <limits>
#include <vector>
using namespace std;
 
int main() {
	vector<int> prices{10, 4, 6, 8, 2, 5, 3, 9, 1};
	// sell at time [i] requires buy at minimum in range [0,i-1]
	// create vector of index at minimum for each range
	int currentMinimumIndex = 0;
	vector<int> minimums{0};
	for(size_t i = 1; i < prices.size(); ++i)
	{
		if (prices[i] < prices[currentMinimumIndex])
		{
			minimums.emplace_back(i);
			currentMinimumIndex = i;
		}
		else
			minimums.emplace_back(currentMinimumIndex);
	} // O(n)
 
	// at this point we have a lookup table for minimum in every range
 
	// attempt to maximize amount we can get if we sell at time i buy buying at minimum for (0,i-1)
	vector<int> maxSales{std::numeric_limits<int>::min()};
	for(size_t i=1;i<prices.size();++i)
	{
		maxSales.emplace_back(prices[i] - prices[minimums[i]]);
	} // O(n)
 
	// find maximum element
	auto maxSum = std::max_element(std::begin(maxSales), std::end(maxSales)); // O(n)
	auto sellAt = std::distance(std::begin(maxSales), maxSum);
	auto buyAt = minimums[sellAt];
	std::cout << "Maximum profit is " << *maxSum << std::endl;
	std::cout << "If we buy at index " << buyAt << " (price: " << prices[buyAt] << ")"
	<< " and sell at " << sellAt << " (price: " << prices[sellAt] << ")" << std::endl;
 
	return 0;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8aW50PiBwcmljZXN7MTAsIDQsIDYsIDgsIDIsIDUsIDMsIDksIDF9OwoJLy8gc2VsbCBhdCB0aW1lIFtpXSByZXF1aXJlcyBidXkgYXQgbWluaW11bSBpbiByYW5nZSBbMCxpLTFdCgkvLyBjcmVhdGUgdmVjdG9yIG9mIGluZGV4IGF0IG1pbmltdW0gZm9yIGVhY2ggcmFuZ2UKCWludCBjdXJyZW50TWluaW11bUluZGV4ID0gMDsKCXZlY3RvcjxpbnQ+IG1pbmltdW1zezB9OwoJZm9yKHNpemVfdCBpID0gMTsgaSA8IHByaWNlcy5zaXplKCk7ICsraSkKCXsKCQlpZiAocHJpY2VzW2ldIDwgcHJpY2VzW2N1cnJlbnRNaW5pbXVtSW5kZXhdKQoJCXsKCQkJbWluaW11bXMuZW1wbGFjZV9iYWNrKGkpOwoJCQljdXJyZW50TWluaW11bUluZGV4ID0gaTsKCQl9CgkJZWxzZQoJCQltaW5pbXVtcy5lbXBsYWNlX2JhY2soY3VycmVudE1pbmltdW1JbmRleCk7Cgl9IC8vIE8obikKCQoJLy8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgbG9va3VwIHRhYmxlIGZvciBtaW5pbXVtIGluIGV2ZXJ5IHJhbmdlCgkKCS8vIGF0dGVtcHQgdG8gbWF4aW1pemUgYW1vdW50IHdlIGNhbiBnZXQgaWYgd2Ugc2VsbCBhdCB0aW1lIGkgYnV5IGJ1eWluZyBhdCBtaW5pbXVtIGZvciAoMCxpLTEpCgl2ZWN0b3I8aW50PiBtYXhTYWxlc3tzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpfTsKCWZvcihzaXplX3QgaT0xO2k8cHJpY2VzLnNpemUoKTsrK2kpCgl7CgkJbWF4U2FsZXMuZW1wbGFjZV9iYWNrKHByaWNlc1tpXSAtIHByaWNlc1ttaW5pbXVtc1tpXV0pOwoJfSAvLyBPKG4pCgkKCS8vIGZpbmQgbWF4aW11bSBlbGVtZW50CglhdXRvIG1heFN1bSA9IHN0ZDo6bWF4X2VsZW1lbnQoc3RkOjpiZWdpbihtYXhTYWxlcyksIHN0ZDo6ZW5kKG1heFNhbGVzKSk7IC8vIE8obikKCWF1dG8gc2VsbEF0ID0gc3RkOjpkaXN0YW5jZShzdGQ6OmJlZ2luKG1heFNhbGVzKSwgbWF4U3VtKTsKCWF1dG8gYnV5QXQgPSBtaW5pbXVtc1tzZWxsQXRdOwoJc3RkOjpjb3V0IDw8ICJNYXhpbXVtIHByb2ZpdCBpcyAiIDw8ICptYXhTdW0gPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJJZiB3ZSBidXkgYXQgaW5kZXggIiA8PCBidXlBdCA8PCAiIChwcmljZTogIiA8PCBwcmljZXNbYnV5QXRdIDw8ICIpIgoJPDwgIiBhbmQgc2VsbCBhdCAiIDw8IHNlbGxBdCA8PCAiIChwcmljZTogIiA8PCBwcmljZXNbc2VsbEF0XSA8PCAiKSIgPDwgc3RkOjplbmRsOwoJCglyZXR1cm4gMDsKfQ==