#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;
}