#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gYXJyID0gezIsMiwzLDUsMiwyLDMsMiwyLDF9OwoKICAgIGludCBrID0gODsKICAgIGludCBuID0gYXJyLnNpemUoKTsKCiAgICAvLyBwcmVmaXggc3VtIC0+IHtmaXJzdCBpbmRleCwgbGFzdCBpbmRleH0KICAgIHVub3JkZXJlZF9tYXA8aW50LCBwYWlyPGludCwgaW50Pj4gbXA7CgogICAgaW50IGxyZyA9IDA7CiAgICBpbnQgc21sID0gSU5UX01BWDsKCiAgICAvLyBwcmVmaXggc3VtIGFycmF5CiAgICB2ZWN0b3I8aW50PiBwKG4sIDApOwoKICAgIHBbMF0gPSBhcnJbMF07CgogICAgZm9yKGludCBpID0gMTsgaSA8IGFyci5zaXplKCk7IGkrKykgewogICAgICAgIHBbaV0gPSBwW2ktMV0gKyBhcnJbaV07CiAgICB9CgogICAgLy8gcHJlZml4IHN1bSAwIGV4aXN0cyBiZWZvcmUgdGhlIGFycmF5IHN0YXJ0cwogICAgbXBbMF0gPSB7LTEsIC0xfTsKCiAgICBmb3IoaW50IGogPSAwOyBqIDwgYXJyLnNpemUoKTsgaisrKSB7CgogICAgICAgIGludCBkID0gcFtqXSAtIGs7CgogICAgICAgIGlmKG1wLmZpbmQoZCkgIT0gbXAuZW5kKCkpIHsKCiAgICAgICAgICAgIC8vIExhcmdlc3QgLT4gdXNlIGZpcnN0L2VhcmxpZXN0IGluZGV4CiAgICAgICAgICAgIGludCBsZW4gPSBqIC0gbXBbZF0uZmlyc3Q7CiAgICAgICAgICAgIGxyZyA9IG1heChscmcsIGxlbik7CgogICAgICAgICAgICAvLyBTbWFsbGVzdCAtPiB1c2UgbGFzdC9sYXRlc3QgaW5kZXgKICAgICAgICAgICAgbGVuID0gaiAtIG1wW2RdLnNlY29uZDsKICAgICAgICAgICAgc21sID0gbWluKHNtbCwgbGVuKTsKICAgICAgICB9CgogICAgICAgIC8vIEZpcnN0IG9jY3VycmVuY2UKICAgICAgICBpZihtcC5maW5kKHBbal0pID09IG1wLmVuZCgpKSB7CiAgICAgICAgICAgIG1wW3Bbal1dID0ge2osIGp9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gS2VlcCBmaXJzdCBpbmRleCwgdXBkYXRlIGxhc3QgaW5kZXgKICAgICAgICAgICAgbXBbcFtqXV0uc2Vjb25kID0gajsKICAgICAgICB9CiAgICB9CgogICAgY291dCA8PCAiTGFyZ2VzdCBsZW5ndGg6ICIgPDwgbHJnIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJTbWFsbGVzdCBsZW5ndGg6ICIgPDwgc21sIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=