Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Maximum Profit

You can obtain profits from foreign exchange margin transactions. For example, if you buy 1000 dollar at a rate of 100 yen per dollar, and sell them at a rate of 108 yen per dollar, you can obtain (108 - 100) × 1000 = 8000 yen.

Write a program which reads values of a currency $R_t$ at a certain time $t$ ($t = 0, 1, 2, ... n-1$), and reports the maximum value of $R_j - R_i$ where $j > i$ .

Input

The first line contains an integer $n$. In the following $n$ lines, $R_t$ ($t = 0, 1, 2, ... n-1$) are given in order.

Output

Print the maximum value in a line.

Constraints

$2 \leq n \leq 200,000$

$1 \leq R_t \leq 10^9$

Sample Input 1

6
5
3
1
3
4
3

Sample Output 1

3

Sample Input 2

3
4
3
2

Sample Output 2

-1

Solution in C (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>

int getNumberOfLine();
int* CreatArrayThroughNumbersOfElements(int numbersOfElements);
int MaximumProfitFromArray(int* array, int number);

int main(void)
{
	int numbersOfLine = getNumberOfLine();
	int* moneyArray = CreatArrayThroughNumbersOfElements(numbersOfLine);
	int max = MaximumProfitFromArray(moneyArray, numbersOfLine);
	printf("%d\n", max);
}

int getNumberOfLine()
{
	int input;
	scanf("%d", &input);
	return input;
}

int* CreatArrayThroughNumbersOfElements(int numbersOfElements)
{
	int *p = (int*) malloc(numbersOfElements * sizeof(int));
	int i;
	for (i = 0; i < numbersOfElements; i++)
		scanf("%d", p + i);
	return p;
}

int MaximumProfitFromArray(int* array, int number)
{
	int i;
	int front, late;
	int minInSearchedElemets = *(array + 0);
	int subOfMaxInNotSearchedElements = 1, maxInNotSearchedElements = *(array + 1);
	int maxProfit = *(array + 1) - *(array);
	for (i = 1; i < number; i++)
	{
		if (*(array + i) > *(array + subOfMaxInNotSearchedElements))
		{
			subOfMaxInNotSearchedElements = i;
		}
	}
	maxInNotSearchedElements = *(array + subOfMaxInNotSearchedElements);
	// printf("In 47 lines, maxProfit = %d ", maxProfit);
	// printf("subOfMaxInNotSearchedElements = %d ", subOfMaxInNotSearchedElements);
	// printf("maxInNotSearchedElements = %d\n", maxInNotSearchedElements);
	// printf("minInSearchedElemets = %d\n", minInSearchedElemets);
	// printf("maxProfit = %d\n", maxProfit);


	for (front = 0; front < number - 1; front++)
	{
		if (*(array + front) > minInSearchedElemets)
		{
			// printf("front = %d, first if continue; now minInSearchedElemets = %d\n", front, minInSearchedElemets);
			continue;
		}
		minInSearchedElemets = *(array + front);
		// printf("change min to: %d\n", minInSearchedElemets);
		if (subOfMaxInNotSearchedElements > front)
		{
			if (maxProfit < maxInNotSearchedElements - *(array + front))
				maxProfit = maxInNotSearchedElements - *(array + front);
			continue;
		}
		subOfMaxInNotSearchedElements = front + 1;
		for (i = front + 1; i < number; i++)
		{
			// printf("now minInSearchedElemets = %d, and i = %d\n", minInSearchedElemets, i);
			if (*(array + i) > *(array + subOfMaxInNotSearchedElements))
			{
				subOfMaxInNotSearchedElements = i;
			}
		}
		maxInNotSearchedElements = *(array + subOfMaxInNotSearchedElements);
		// printf("now min = %d, maxInNotSearchedElements = %d\n", minInSearchedElemets, maxInNotSearchedElements);
		if (maxProfit < maxInNotSearchedElements - *(array + front))
		{
			// printf("front = %d, when min = %d\n", front, minInSearchedElemets);
			maxProfit = maxInNotSearchedElements - *(array + front);
		}

	}

	return maxProfit;
}