classSolution { public: vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k){ int n = size(nums); vector<int> w(n); w[0] = accumulate(begin(nums), begin(nums) + k, 0); for (int i = 1; i + k <= n; ++i) { w[i] = w[i - 1] - nums[i - 1] + nums[i - 1 + k]; } vector<int> left(n); int best = 0; for (int i = 1; i + k <= n; ++i) { if (w[i] > w[best]) { best = i; } left[i] = best; } vector<int> right(n); best = n - k; for (int i = n - k; i >= 0; --i) { if (w[i] >= w[best]) { best = i; } right[i] = best; } vector<int> res; best = 0; for (int i = k; i + k + k <= n; ++i) { int l = left[i - k], r = right[i + k]; if (w[l] + w[i] + w[r] > best) { best = w[l] + w[i] + w[r]; res = {l, i, r}; } } return res; } };