#include <cassert>
#include <stack>
#include <vector>
using namespace std;
int trap_rain_water(const vector<int> &h) {
int sum = 0;
stack<int> last_seen_level_at;
int last_i = 0;
for (int col = 0; col < h.size(); ++col) {
int i = h[col];
if (i > last_i) {
// flush prev levels below
for (auto k = i; k > last_i; --k) {
if (!last_seen_level_at.empty()) {
sum += (col - last_seen_level_at.top());
last_seen_level_at.pop();
}
}
}
if (i < last_i) {
// track start col of levels
for (auto k = last_i; k > i; --k) {
last_seen_level_at.push(col);
}
}
last_i = i;
}
return sum;
}
int main() {
// www.youtube.com/watch?v=HmBbcDiJapY&t=333s
vector<int> 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+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCB0cmFwX3JhaW5fd2F0ZXIoY29uc3QgdmVjdG9yPGludD4gJmgpIHsKICBpbnQgc3VtID0gMDsKCiAgc3RhY2s8aW50PiBsYXN0X3NlZW5fbGV2ZWxfYXQ7CiAgaW50IGxhc3RfaSA9IDA7CiAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgaC5zaXplKCk7ICsrY29sKSB7CiAgICBpbnQgaSA9IGhbY29sXTsKCiAgICBpZiAoaSA+IGxhc3RfaSkgewogICAgICAvLyBmbHVzaCBwcmV2IGxldmVscyBiZWxvdwogICAgICBmb3IgKGF1dG8gayA9IGk7IGsgPiBsYXN0X2k7IC0taykgewogICAgICAgIGlmICghbGFzdF9zZWVuX2xldmVsX2F0LmVtcHR5KCkpIHsKICAgICAgICAgIHN1bSArPSAoY29sIC0gbGFzdF9zZWVuX2xldmVsX2F0LnRvcCgpKTsKICAgICAgICAgIGxhc3Rfc2Vlbl9sZXZlbF9hdC5wb3AoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaSA8IGxhc3RfaSkgewogICAgICAvLyB0cmFjayBzdGFydCBjb2wgb2YgbGV2ZWxzCiAgICAgIGZvciAoYXV0byBrID0gbGFzdF9pOyBrID4gaTsgLS1rKSB7CiAgICAgICAgbGFzdF9zZWVuX2xldmVsX2F0LnB1c2goY29sKTsKICAgICAgfQogICAgfQoKICAgIGxhc3RfaSA9IGk7CiAgfQogIHJldHVybiBzdW07Cn0KCmludCBtYWluKCkgewogIC8vIHd3dy55b3V0dWJlLmNvbS93YXRjaD92PUhtQmJjRGlKYXBZJnQ9MzMzcwogIHZlY3RvcjxpbnQ+IGggPSB7MSwgMCwgMiwgMSwgMCwgMSwgMywgMiwgMSwgMiwgMX07CiAgaW50IHJlc3VsdCA9IDEgKyAxICsgMiArIDEgKyAxOwoKICBhc3NlcnQodHJhcF9yYWluX3dhdGVyKGgpID09IHJlc3VsdCk7CiAgcmV0dXJuIDA7Cn0K