#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int maxLength(vector<int>& arr) {
int n = arr.size();
// prefixSum -> first index
unordered_map<int, int> firstSeen;
int prefixSum = 0;
int maxLen = 0;
// insert prefix sum 0 at index -1
// to handle sum from start
firstSeen[0] = -1;
for (int i = 0; i < n; i++) {
prefixSum += arr[i];
// prefix sum has been seen before
if (firstSeen.find(prefixSum) != firstSeen.end()) {
int prevIndex = firstSeen[prefixSum];
int length = i - prevIndex;
maxLen = max(maxLen, length);
}
else {
// Store first occurrence of this prefix sum
firstSeen[prefixSum] = i;
}
}
return maxLen;
}
int main() {
vector<int> arr = {15, -2, 2, -8, 1, 7, 10};
cout << maxLength(arr) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYXhMZW5ndGgodmVjdG9yPGludD4mIGFycikgewogICAgaW50IG4gPSBhcnIuc2l6ZSgpOwogICAgCiAgICAvLyBwcmVmaXhTdW0gLT4gZmlyc3QgaW5kZXgKICAgIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IGZpcnN0U2VlbjsgCiAgICBpbnQgcHJlZml4U3VtID0gMDsKICAgIGludCBtYXhMZW4gPSAwOwoKICAgIC8vIGluc2VydCBwcmVmaXggc3VtIDAgYXQgaW5kZXggLTEKICAgIC8vIHRvIGhhbmRsZSBzdW0gZnJvbSBzdGFydAogICAgZmlyc3RTZWVuWzBdID0gLTE7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBwcmVmaXhTdW0gKz0gYXJyW2ldOwoKICAgICAgICAvLyBwcmVmaXggc3VtIGhhcyBiZWVuIHNlZW4gYmVmb3JlCiAgICAgICAgaWYgKGZpcnN0U2Vlbi5maW5kKHByZWZpeFN1bSkgIT0gZmlyc3RTZWVuLmVuZCgpKSB7CiAgICAgICAgICAgIGludCBwcmV2SW5kZXggPSBmaXJzdFNlZW5bcHJlZml4U3VtXTsKICAgICAgICAgICAgaW50IGxlbmd0aCA9IGkgLSBwcmV2SW5kZXg7CiAgICAgICAgICAgIG1heExlbiA9IG1heChtYXhMZW4sIGxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAKICAgICAgICAgICAgLy8gU3RvcmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHByZWZpeCBzdW0KICAgICAgICAgICAgZmlyc3RTZWVuW3ByZWZpeFN1bV0gPSBpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWF4TGVuOwp9CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxpbnQ+IGFyciA9IHsxNSwgLTIsIDIsIC04LCAxLCA3LCAxMH07CiAgICBjb3V0IDw8IG1heExlbmd0aChhcnIpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==