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 C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

const int MM = 1e9 + 7;
const double eps = 1e-8;
const int MAXN = 2e6 + 10;

int n, m;
int Q;
int a[MAXN], f[MAXN], g[MAXN], num[MAXN];

void read(){
	scanf("%d%d", &n, &m);
	scanf("%d", &Q);
	for(int i = 1; i <= Q; i++){
		scanf("%d", &a[i]);
	}
}

int check(){
	f[0] = 2 * (n + Q);
	for(int i = 1; i <= n; i++)
		f[i] = 0;
	for(int i = Q; i; i--)
		if (f[a[i]-1]){
		//	f[a[i]-1]--;
			if (f[a[i]-1] > f[a[i]])
				f[a[i]]++;
		}
		else
			return 0;
	return 1;
}

int solve(){
	if (check()) return 1;
	for(int i = 1; i <= n; i++)
		f[i] = 0;
	int cnt = 0;
	for(int i = Q; i; i--){
		int x = a[i];
		if (f[x] == 0){
			g[x] = ++cnt;
			num[cnt] = x;
			f[x]++;
		}
		else{
			if (f[num[g[x]-1]] > f[x])
				f[x]++;
		}
	}
	/*
	for(int i = 1; i <= 3; i++)
		cout<<f[i]<<' '; cout<<endl;
	for(int i = 1; i <= 3; i++)
		cout<<g[i]<<' '; cout<<endl;
	for(int i = 1; i <= 3; i++)
		cout<<num[i]<<' '; cout<<endl;
	cout<<cnt<<endl;*/
	int now = -1;
	for(int i = 0; i <= n; i++)
		g[i] = 0;
	for(int i = 1; i <= cnt; i++)
		if (f[num[i]] < n){
			now = i;
			break;
		}
		else{
			g[num[i]] = 1;
		}
	if (now == -1) return 1;
	for(int i = now, j = 0; i <= cnt && j <= n; i++, j++){
		while(g[j] && j <= n) j++;
		if (j > n) break;
		if (num[i] != j)
			return 0;
	}
	return 1;
}

void printans(int flag){
	puts(flag ? "Yes" : "No");
}
	

int main(){
	int T = 1;
//	cin>>T;
	while(T--){
		read();
		printans(solve());
	}
	return 0;
}