int longestSubarray(vector<int>& arr, int k) {
// code here
int presum = 0, res=0;
unordered_map<int, int> mp;
for(int i=0; i<arr.size(); i++) {
presum += arr[i];
if(presum == k)
res = max(res, i+1);
else if(mp.find(presum-k) != mp.end())
res = max(res, i-mp[presum-k]);
if(mp.find(presum) == mp.end())
mp[presum] = i;
}
return res;
}