public static void Main(String[] args)
var totalCases = Convert.ToInt16(Console.ReadLine());
var N = new int[totalCases];
var ai = new string[totalCases];
for (var i = 0; i < totalCases; i++)
N[i] = Convert.ToInt32(Console.ReadLine());
ai[i] = Console.ReadLine();
var items = ai[i].Split(' ');
var intItems = new int[N[i]];
for (var j = 0; j < N[i]; j++)
intItems[j] = Convert.ToInt32(items[j]);
totalCount += intItems[j];
var sequentialCount = MaxSubArraySum(intItems, 0, N[i] - 1, CheckifAllAreNegative(intItems));
totalCount = sequentialCount;
Console.WriteLine(string.Format("{0} {1}", sequentialCount, totalCount));
static int Max(int a, int b)
static int Max(int a, int b, int c)
return Max(Max(a, b), c);
static bool CheckifAllAreNegative(int[] arr)
for (var i = 0; i < arr.Length; i++)
static int MaxCrossingSum(int[] arr, int l, int m, int h, bool IsAllNegative)
for (var i = m; i >= l; i--)
if (IsAllNegative || sum > leftSum)
for (var i = m + 1; i <= h; i++)
if (CheckifAllAreNegative(arr) || sum > rightSum)
return leftSum + rightSum;
static int MaxSubArraySum(int[] arr, int l, int h, bool IsAllNegative)
var leftHalf = MaxSubArraySum(arr, l, m, IsAllNegative);
var rightHalf = MaxSubArraySum(arr, m + 1, h, IsAllNegative);
var crossing = MaxCrossingSum(arr, l, m, h, IsAllNegative);