#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> arr = {2,2,3,5,2,2,3,2,2,1};

    int k = 8;
    int n = arr.size();

    // prefix sum -> {first index, last index}
    unordered_map<int, pair<int, int>> mp;

    int lrg = 0;
    int sml = INT_MAX;

    // prefix sum array
    vector<int> p(n, 0);

    p[0] = arr[0];

    for(int i = 1; i < arr.size(); i++) {
        p[i] = p[i-1] + arr[i];
    }

    // prefix sum 0 exists before the array starts
    mp[0] = {-1, -1};

    for(int j = 0; j < arr.size(); j++) {

        int d = p[j] - k;

        if(mp.find(d) != mp.end()) {

            // Largest -> use first/earliest index
            int len = j - mp[d].first;
            lrg = max(lrg, len);

            // Smallest -> use last/latest index
            len = j - mp[d].second;
            sml = min(sml, len);
        }

        // First occurrence
        if(mp.find(p[j]) == mp.end()) {
            mp[p[j]] = {j, j};
        }
        else {
            // Keep first index, update last index
            mp[p[j]].second = j;
        }
    }

    cout << "Largest length: " << lrg << endl;
    cout << "Smallest length: " << sml << endl;

    return 0;
}