/// <summary>
        /// Finds the maximum sum sub array by brute force method.
        /// </summary>
        /// <param name="a">input array.</param>
        /// <returns>Returns sub array [start index, end index] having maximum sum</returns>
        public static SubArraySumResult FindMaxSumSubArrayByBruteForceMethod(int[] a)
        {
            SubArraySumResult result = new SubArraySumResult();

            int lastSubArrayStartIndex = 0;

            for (int i = 0; i < a.Length; i++)
            {
                for (int j = i; j < a.Length; j++)
                {
                    var currSubArraySum = GetSum(a, i, j);
                    if (currSubArraySum > result.Sum)
                    {
                        result.Sum = currSubArraySum;
                        result.SubArrayIndexes.Clear();
                        result.SubArrayIndexes.Add(new Tuple <int, int>(i, j));
                        lastSubArrayStartIndex = i;
                    }
                    else if (currSubArraySum == result.Sum && lastSubArrayStartIndex != i)
                    {
                        /* Reason for the check => (lastSubArrayStartIndex != i):
                         * If the current subarray with max-sum includes
                         * the previously added subarray
                         * then do not add the subarray as max-sum subarray
                         * Example: 0-3 = 10 and 0-5 = 10 then
                         * do no consider the second sub-array ranging 0-5 as max-sum subarray.
                         */
                        result.SubArrayIndexes.Add(new Tuple <int, int>(i, j));
                        lastSubArrayStartIndex = i;
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// Finds the maximum sum sub array using kadanes algorithm.
        /// </summary>
        /// <param name="a">input array.</param>
        /// <returns>Returns sub array [start index, end index] having maximum sum</returns>
        public static SubArraySumResult FindMaxSumSubArrayByKadanesAlgorithmCustom(int[] a, int endElement)
        {
            var result = new SubArraySumResult()
            {
                Sum = 0
            };

            long maxSumEndingHere = 0;

            int startIndex = -1,
                endIndex   = -1;

            if (a.Length > 0)
            {
                result.Sum       = a[0];
                startIndex       = 0;
                endIndex         = 0;
                maxSumEndingHere = a[0];

                result.SubArrayIndexes.Add(new Tuple <int, int>(startIndex, endIndex));
            }

            for (int i = 1; i < a.Length; i++)
            {
                var maxSumEndingHereTemp = maxSumEndingHere + a[i];

                if (maxSumEndingHereTemp > a[i])
                {
                    maxSumEndingHere = maxSumEndingHereTemp;
                    endIndex         = i;
                }
                else // a[i] >= maxSumEndingHereTemp
                {
                    maxSumEndingHere = a[i];
                    startIndex       = i;
                    endIndex         = i;
                }

                if (maxSumEndingHere > result.Sum)
                {
                    result.Sum = maxSumEndingHere;
                    result.SubArrayIndexes.Clear();
                    result.SubArrayIndexes.Add(new Tuple <int, int>(startIndex, endIndex));
                }
                else if (maxSumEndingHere == result.Sum)
                {
                    result.SubArrayIndexes.Add(new Tuple <int, int>(startIndex, endIndex));
                }

                if (a[i] == endElement)
                {
                    maxSumEndingHere = 0;
                    startIndex       = endIndex = i + 1;
                }
            }

            return(result);
        }