3. What will be the output of the following C# code snippet using divide and conquer to find max subarray sum?
int[] arr = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
int maxSum = FindMaxSubarray(arr, 0, arr.Length - 1);
Console.WriteLine(maxSum);
int FindMaxSubarray(int[] a, int left, int right) {
if (left == right) return a[left];
int mid = (left + right) / 2;
int leftMax = FindMaxSubarray(a, left, mid);
int rightMax = FindMaxSubarray(a, mid + 1, right);
int crossMax = FindMaxCrossingSubarray(a, left, mid, right);
return Math.Max(Math.Max(leftMax, rightMax), crossMax);
}
int FindMaxCrossingSubarray(int[] a, int left, int mid, int right) {
int leftSum = int.MinValue, sum = 0;
for (int i = mid; i >= left; i--) {
sum += a[i];
if (sum > leftSum) leftSum = sum;
}
int rightSum = int.MinValue;
sum = 0;
for (int j = mid + 1; j <= right; j++) {
sum += a[j];
if (sum > rightSum) rightSum = sum;
}
return leftSum + rightSum;
}