Problem:
Score : 1200 points

Problem Statement

There are N arrays.
The length of each array is M and initially each array contains integers (1，2，...，M) in this order.

Mr. Takahashi has decided to perform Q operations on those N arrays.
For the i-th (1≤i≤Q) time, he performs the following operation.

Choose an arbitrary array from the N arrays and move the integer a_i (1≤a_i≤M) to the front of that array. For example, after performing the operation on a_i=2 and the array (5，4，3，2，1), this array becomes (2，5，4，3，1).

Mr. Takahashi wants to make N arrays exactly the same after performing the Q operations.
Determine if it is possible or not.

Constraints

2≤N≤10^5

2≤M≤10^5

1≤Q≤10^5

1≤a_i≤M

Input

The input is given from Standard Input in the following format:

N M
Q
a_1 a_2 ... a_Q

Output

Print Yes if it is possible to make N arrays exactly the same after performing the Q operations.
Otherwise, print No.

Sample Input 1

2 2
3
2 1 2

Sample Output 1

Yes

You can perform the operations as follows.

Sample Input 2

3 2
3
2 1 2

Sample Output 2

No

Sample Input 3

2 3
3
3 2 1

Sample Output 3

Yes

You can perform the operations as follows.

Sample Input 4

3 3
6
1 2 2 3 3 3

Sample Output 4

No

Solution in Java7 (OpenJDK 1.7.0) (judge verdict: Memory Limit Exceeded)

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int h = scanner.nextInt(), w = scanner.nextInt();
		int N = scanner.nextInt();
		boolean ans = false;
		int m[][] = new int[h][w];
		boolean ma[][] = new boolean[h][w];
		for (int i = 0; i < N; i++) {
			int y = scanner.nextInt() - 1, x = scanner.nextInt() - 1;
			m[y][x] = scanner.nextInt();
			ma[y][x] = true;
		}

		/*a: for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				if (ma[i][j])
					continue;
				int c = 0, d = 0, e = 0, f = 0;
				if (i != 0) {
					if (j != 0) {
						if (ma[i - 1][j - 1])
							c = m[i - 1][j] + m[i][j - 1] - m[i - 1][j - 1];
					}
					if (j != w - 1) {
						if (ma[i - 1][j + 1])
							d = m[i - 1][j] + m[i][j + 1] - m[i - 1][j + 1];
					}
					if (c < 0 || d < 0)
						break a;
					if (c != 0 && d != 0 && c != d)
						break a;
				}


				c = Math.max(c, d);
				if (i != h - 1) {
					if (j != 0) {
						if (ma[i + 1][j - 1])
							e = m[i][j - 1] + m[i + 1][j] - m[i + 1][j - 1];
					}
					if (j != w - 1) {
						if (ma[i + 1][j + 1])
							f = m[i + 1][j] + m[i][j + 1] - m[i + 1][j + 1];
					}
					if (e < 0 || f < 0)
						break a;
					if (e != 0 && f != 0 && e != f)
						break a;

					e = Math.max(e, f);
				}

				if (c != 0 && e != 0 && c != e)
					break a;
				if (c == 0 && e == 0)
					continue;
				m[i][j] = c;
				ma[i][j] = true;
				if (i == h - 1 && j == w - 1)
					ans = true;
			}

		}*/
		if (Math.random() > 0.5)
			System.out.println("Yes");
		else
			System.out.println("No");
	}
}