#include <cassert>
#include <map>
#include <vector>
using namespace std;
using Hystogram = vector<int>;
using Value = int;
using Column = int;
int trap_rain_water(const Hystogram &h) {
int sum = 0;
map<Value, Column> last_seen_level_at;
int last_i = 0;
for (Column col = 0; col < h.size(); ++col) {
Value i = h[col];
if (i > last_i) {
// flush prev levels below
for (auto k = i; k > last_i; --k) {
if (last_seen_level_at[k] > 0) {
// how much level taken by water
sum += (col - last_seen_level_at[k]);
}
}
}
if (i < last_i) {
// track start col of levels
for (auto k = last_i; k > i; --k) {
last_seen_level_at[k] = col;
}
}
last_i = i;
}
return sum;
}
int main() {
// https://w...content-available-to-author-only...e.com/watch?v=HmBbcDiJapY&t=333s
Hystogram h = {1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};
int result = 1 + 1 + 2 + 1 + 1;
assert(trap_rain_water(h) == result);
return 0;
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBIeXN0b2dyYW0gPSB2ZWN0b3I8aW50PjsKdXNpbmcgVmFsdWUgPSBpbnQ7CnVzaW5nIENvbHVtbiA9IGludDsKCmludCB0cmFwX3JhaW5fd2F0ZXIoY29uc3QgSHlzdG9ncmFtICZoKSB7CiAgaW50IHN1bSA9IDA7CgogIG1hcDxWYWx1ZSwgQ29sdW1uPiBsYXN0X3NlZW5fbGV2ZWxfYXQ7CiAgaW50IGxhc3RfaSA9IDA7CiAgZm9yIChDb2x1bW4gY29sID0gMDsgY29sIDwgaC5zaXplKCk7ICsrY29sKSB7CiAgICBWYWx1ZSBpID0gaFtjb2xdOwoKICAgIGlmIChpID4gbGFzdF9pKSB7CiAgICAgIC8vIGZsdXNoIHByZXYgbGV2ZWxzIGJlbG93CiAgICAgIGZvciAoYXV0byBrID0gaTsgayA+IGxhc3RfaTsgLS1rKSB7CiAgICAgICAgaWYgKGxhc3Rfc2Vlbl9sZXZlbF9hdFtrXSA+IDApIHsKICAgICAgICAgIC8vIGhvdyBtdWNoIGxldmVsIHRha2VuIGJ5IHdhdGVyCiAgICAgICAgICBzdW0gKz0gKGNvbCAtIGxhc3Rfc2Vlbl9sZXZlbF9hdFtrXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGkgPCBsYXN0X2kpIHsKICAgICAgLy8gdHJhY2sgc3RhcnQgY29sIG9mIGxldmVscwogICAgICBmb3IgKGF1dG8gayA9IGxhc3RfaTsgayA+IGk7IC0taykgewogICAgICAgIGxhc3Rfc2Vlbl9sZXZlbF9hdFtrXSA9IGNvbDsKICAgICAgfQogICAgfQoKICAgIGxhc3RfaSA9IGk7CiAgfQogIHJldHVybiBzdW07Cn0KCmludCBtYWluKCkgewogIC8vIGh0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vd2F0Y2g/dj1IbUJiY0RpSmFwWSZ0PTMzM3MKICBIeXN0b2dyYW0gaCA9IHsxLCAwLCAyLCAxLCAwLCAxLCAzLCAyLCAxLCAyLCAxfTsKICBpbnQgcmVzdWx0ID0gMSArIDEgKyAyICsgMSArIDE7CgogIGFzc2VydCh0cmFwX3JhaW5fd2F0ZXIoaCkgPT0gcmVzdWx0KTsKICByZXR1cm4gMDsKfQo=