#include <iostream>
#include <vector>
template <typename InputIt, typename OutputIt>
void ComputeMinUntilHere(InputIt begin, InputIt end, OutputIt output)
{
if (begin == end) {
return;
}
auto min = *begin;
while (begin != end) {
min = std::min(min, *begin);
*output = min;
++begin;
++output;
}
}
struct MinByBlock
{
std::vector<int> minUntilHere;
std::vector<int> minStartingHere;
};
MinByBlock ComputeMinByBlock(const std::vector<int>&v, std::size_t blockSize)
{
MinByBlock res;
res.minUntilHere.resize(v.size());
res.minStartingHere.resize(v.size());
for (std::size_t i = 0; i < v.size(); i += blockSize) {
const auto blockBegin = v.begin() + i;
const auto blockEndIndex = std::min(i + blockSize, v.size());
const auto blockEnd = v.begin() + blockEndIndex;
ComputeMinUntilHere(blockBegin, blockEnd, res.minUntilHere.begin() + i);
ComputeMinUntilHere(std::make_reverse_iterator(blockEnd),
std::make_reverse_iterator(blockBegin),
std::make_reverse_iterator(res.minStartingHere.begin() + blockEndIndex));
}
return res;
}
void print(const std::vector<int>& v)
{
std::cout << "{ ";
for (const auto e : v) {
std::cout << e << " ";
}
std::cout << "}\n";
}
int main()
{
const std::vector<int> v = {2, 1, 3, 6, 5, 4, 42};
const auto res = ComputeMinByBlock(v, 2);
print(res.minUntilHere);
print(res.minStartingHere);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXQsIHR5cGVuYW1lIE91dHB1dEl0Pgp2b2lkIENvbXB1dGVNaW5VbnRpbEhlcmUoSW5wdXRJdCBiZWdpbiwgSW5wdXRJdCBlbmQsIE91dHB1dEl0IG91dHB1dCkKewogICAgaWYgKGJlZ2luID09IGVuZCkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGF1dG8gbWluID0gKmJlZ2luOwogICAgd2hpbGUgKGJlZ2luICE9IGVuZCkgewogICAgICAgIG1pbiA9IHN0ZDo6bWluKG1pbiwgKmJlZ2luKTsKICAgICAgICAqb3V0cHV0ID0gbWluOwogICAgICAgICsrYmVnaW47CiAgICAgICAgKytvdXRwdXQ7CiAgICB9Cn0KCnN0cnVjdCBNaW5CeUJsb2NrCnsKICAgIHN0ZDo6dmVjdG9yPGludD4gbWluVW50aWxIZXJlOwogICAgc3RkOjp2ZWN0b3I8aW50PiBtaW5TdGFydGluZ0hlcmU7Cn07CgpNaW5CeUJsb2NrIENvbXB1dGVNaW5CeUJsb2NrKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mdiwgc3RkOjpzaXplX3QgYmxvY2tTaXplKQp7CiAgICBNaW5CeUJsb2NrIHJlczsKICAgIHJlcy5taW5VbnRpbEhlcmUucmVzaXplKHYuc2l6ZSgpKTsKICAgIHJlcy5taW5TdGFydGluZ0hlcmUucmVzaXplKHYuc2l6ZSgpKTsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSArPSBibG9ja1NpemUpIHsKICAgICAgICBjb25zdCBhdXRvIGJsb2NrQmVnaW4gPSB2LmJlZ2luKCkgKyBpOwogICAgICAgIGNvbnN0IGF1dG8gYmxvY2tFbmRJbmRleCA9IHN0ZDo6bWluKGkgKyBibG9ja1NpemUsIHYuc2l6ZSgpKTsKICAgICAgICBjb25zdCBhdXRvIGJsb2NrRW5kID0gdi5iZWdpbigpICsgYmxvY2tFbmRJbmRleDsKICAgICAgICAKICAgICAgICBDb21wdXRlTWluVW50aWxIZXJlKGJsb2NrQmVnaW4sIGJsb2NrRW5kLCByZXMubWluVW50aWxIZXJlLmJlZ2luKCkgKyBpKTsKICAgICAgICBDb21wdXRlTWluVW50aWxIZXJlKHN0ZDo6bWFrZV9yZXZlcnNlX2l0ZXJhdG9yKGJsb2NrRW5kKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9yZXZlcnNlX2l0ZXJhdG9yKGJsb2NrQmVnaW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3JldmVyc2VfaXRlcmF0b3IocmVzLm1pblN0YXJ0aW5nSGVyZS5iZWdpbigpICsgYmxvY2tFbmRJbmRleCkpOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKdm9pZCBwcmludChjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiB2KQp7CiAgICBzdGQ6OmNvdXQgPDwgInsgIjsKICAgIGZvciAoY29uc3QgYXV0byBlIDogdikgewogICAgICAgIHN0ZDo6Y291dCA8PCBlIDw8ICIgIjsgCiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgIn1cbiI7Cn0KCmludCBtYWluKCkKewogICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiB2ID0gezIsIDEsIDMsIDYsIDUsIDQsIDQyfTsKICAgIAogICAgY29uc3QgYXV0byByZXMgPSBDb21wdXRlTWluQnlCbG9jayh2LCAyKTsKICAgIAogICAgcHJpbnQocmVzLm1pblVudGlsSGVyZSk7CiAgICBwcmludChyZXMubWluU3RhcnRpbmdIZXJlKTsKICAgIAp9