#include <iostream>
#include <vector>
#include <climits>
#include <unordered_map>
using std::vector;
std::pair<long long, vector<int>> findMaxUniqueSubarray(const vector<int>& nums, int k) {
if (k <= 0 || k > (int)nums.size())
return {0, {}};
std::unordered_map<int,int> freq;
long long sum = 0, bestSum = LLONG_MIN;
int left = 0;
vector<int> bestWindow;
for (int right = 0; right < (int)nums.size(); right++) {
freq[nums[right]]++;
sum += nums[right];
// shrink if duplicates appear
while (freq[nums[right]] > 1) {
freq[nums[left]]--;
sum -= nums[left];
left++;
}
// shrink if window too large
while (right - left + 1 > k) {
freq[nums[left]]--;
sum -= nums[left];
left++;
}
// valid window of size k
if (right - left + 1 == k) {
// IMPORTANT: choose the FIRST maximum window
if (bestSum == LLONG_MIN) {
bestSum = sum;
bestWindow.assign(nums.begin() + left, nums.begin() + right + 1);
}
}
}
if (bestSum == LLONG_MIN) return {0, {}};
return {bestSum, bestWindow};
}
int main() {
vector<int> nums = {3, 2, 2, 4, 4, 6, 7, 7, 8, -1};
int k = 3;
auto result = findMaxUniqueSubarray(nums, k);
std::cout << "Max sum = " << result.first << "\nElements: ";
for (int x : result.second) std::cout << x << " ";
}
/*
OUTPUT:
Max sum = 17
Elements: 4 6 7
*/