#include <algorithm>
#include <vector>
#include <iostream>
std::vector<int> compute_cumulative_sum(const std::vector<int>& v)
{
std::vector<int> res(1);
int sum = 0;
for(auto e : v) {
sum += e;
res.push_back(sum);
}
return res;
}
int get_min_partition3_value(const std::vector<int>& v)
{
const auto cumulative_sum = compute_cumulative_sum(v);
const auto ideal_part = cumulative_sum.back() / 3;
auto it1 = std::upper_bound(cumulative_sum.begin(), cumulative_sum.end(), ideal_part);
auto it2 = std::lower_bound(cumulative_sum.begin(), cumulative_sum.end(), cumulative_sum.back() - ideal_part);
if (it1 == cumulative_sum.end()) {
return 0;
}
auto part1 = *it1;
auto part2 = *it2 - *it1;
auto part3 = cumulative_sum.back() - *it2;
auto res = std::max({ part1, part2, part3 });
if(it1 != begin(cumulative_sum)) {
--it1;
part1 = *it1;
part2 = *it2 - *it1;
part3 = cumulative_sum.back() - *it2;
res = std::min(res, std::max({ part1, part2, part3 }));
++it1;
}
if(std::next(it2, 1) != end(cumulative_sum)) {
++it2;
part1 = *it1;
part2 = *it2 - *it1;
part3 = cumulative_sum.back() - *it2;
res = std::min(res, std::max({ part1, part2, part3 }));
if(it1 != begin(cumulative_sum)) {
--it1;
part1 = *it1;
part2 = *it2 - *it1;
part3 = cumulative_sum.back() - *it2;
}
}
return res;
}
int main()
{
std::cout << get_min_partition3_value({}) << std::endl;
std::cout << get_min_partition3_value({ 1, 1, 1, 1, 1, 1 }) << std::endl;
std::cout << get_min_partition3_value({ 2, 80, 50, 42, 1, 1, 1, 2 }) << std::endl;
std::cout << get_min_partition3_value({ 2, 5, 80, 1, 200, 80, 8000, 90 }) << std::endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RkOjp2ZWN0b3I8aW50PiBjb21wdXRlX2N1bXVsYXRpdmVfc3VtKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHYpCnsKICAgIHN0ZDo6dmVjdG9yPGludD4gcmVzKDEpOwoKICAgIGludCBzdW0gPSAwOwogICAgZm9yKGF1dG8gZSA6IHYpIHsKICAgICAgICBzdW0gKz0gZTsKICAgICAgICByZXMucHVzaF9iYWNrKHN1bSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgppbnQgZ2V0X21pbl9wYXJ0aXRpb24zX3ZhbHVlKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHYpCnsKICAgIGNvbnN0IGF1dG8gY3VtdWxhdGl2ZV9zdW0gPSBjb21wdXRlX2N1bXVsYXRpdmVfc3VtKHYpOwogICAgY29uc3QgYXV0byBpZGVhbF9wYXJ0ID0gY3VtdWxhdGl2ZV9zdW0uYmFjaygpIC8gMzsKCiAgICBhdXRvIGl0MSA9IHN0ZDo6dXBwZXJfYm91bmQoY3VtdWxhdGl2ZV9zdW0uYmVnaW4oKSwgY3VtdWxhdGl2ZV9zdW0uZW5kKCksIGlkZWFsX3BhcnQpOwogICAgYXV0byBpdDIgPSBzdGQ6Omxvd2VyX2JvdW5kKGN1bXVsYXRpdmVfc3VtLmJlZ2luKCksIGN1bXVsYXRpdmVfc3VtLmVuZCgpLCBjdW11bGF0aXZlX3N1bS5iYWNrKCkgLSBpZGVhbF9wYXJ0KTsKCiAgICBpZiAoaXQxID09IGN1bXVsYXRpdmVfc3VtLmVuZCgpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBhdXRvIHBhcnQxID0gKml0MTsKICAgIGF1dG8gcGFydDIgPSAqaXQyIC0gKml0MTsKICAgIGF1dG8gcGFydDMgPSBjdW11bGF0aXZlX3N1bS5iYWNrKCkgLSAqaXQyOwogICAgYXV0byByZXMgPSBzdGQ6Om1heCh7IHBhcnQxLCBwYXJ0MiwgcGFydDMgfSk7CgogICAgaWYoaXQxICE9IGJlZ2luKGN1bXVsYXRpdmVfc3VtKSkgewogICAgICAgIC0taXQxOwogICAgICAgIHBhcnQxID0gKml0MTsKICAgICAgICBwYXJ0MiA9ICppdDIgLSAqaXQxOwogICAgICAgIHBhcnQzID0gY3VtdWxhdGl2ZV9zdW0uYmFjaygpIC0gKml0MjsKICAgICAgICByZXMgPSBzdGQ6Om1pbihyZXMsIHN0ZDo6bWF4KHsgcGFydDEsIHBhcnQyLCBwYXJ0MyB9KSk7CiAgICAgICAgKytpdDE7CiAgICB9CgogICAgaWYoc3RkOjpuZXh0KGl0MiwgMSkgIT0gZW5kKGN1bXVsYXRpdmVfc3VtKSkgewogICAgICAgICsraXQyOwogICAgICAgIHBhcnQxID0gKml0MTsKICAgICAgICBwYXJ0MiA9ICppdDIgLSAqaXQxOwogICAgICAgIHBhcnQzID0gY3VtdWxhdGl2ZV9zdW0uYmFjaygpIC0gKml0MjsKICAgICAgICByZXMgPSBzdGQ6Om1pbihyZXMsIHN0ZDo6bWF4KHsgcGFydDEsIHBhcnQyLCBwYXJ0MyB9KSk7CgogICAgICAgIGlmKGl0MSAhPSBiZWdpbihjdW11bGF0aXZlX3N1bSkpIHsKICAgICAgICAgICAgLS1pdDE7CiAgICAgICAgICAgIHBhcnQxID0gKml0MTsKICAgICAgICAgICAgcGFydDIgPSAqaXQyIC0gKml0MTsKICAgICAgICAgICAgcGFydDMgPSBjdW11bGF0aXZlX3N1bS5iYWNrKCkgLSAqaXQyOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXM7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8IGdldF9taW5fcGFydGl0aW9uM192YWx1ZSh7fSkgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IGdldF9taW5fcGFydGl0aW9uM192YWx1ZSh7IDEsIDEsIDEsIDEsIDEsIDEgfSkgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IGdldF9taW5fcGFydGl0aW9uM192YWx1ZSh7IDIsIDgwLCA1MCwgNDIsIDEsIDEsIDEsIDIgfSkgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IGdldF9taW5fcGFydGl0aW9uM192YWx1ZSh7IDIsIDUsIDgwLCAxLCAyMDAsIDgwLCA4MDAwLCA5MCB9KSA8PCBzdGQ6OmVuZGw7Cgp9Cg==