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: Accepted)

#include<cstdio>
#include<iostream>
#include<cstring>
#define RG register
using namespace std;
const int N=1e5+10;
int n,m,q,num[N],cnt,sum[N],pos[N],a[N];
bool vis[N];
template<typename I> inline void read(I &ot){
	I ch=getchar(), x=0, f=1;
	while(ch<'0' || ch>'9'){if(ch=='-') f=-1; ch=getchar();	}
	while(ch>='0' && ch<='9'){x=x*10+ch-'0'; ch=getchar();	}
	ot=x*f;}
template<typename I, typename... U> inline void read(I &x,U&... y){read(x); read(y...);}
int main()
{
	//freopen("LRU Puzzle.in","r",stdin);
	read(n,m,q);
	for(RG int i=1;i<=q;i++) read(a[i]);
	for(RG int i=q;i;i--)
	 if(!vis[a[i]])
	 {
		num[++cnt]=a[i];
		pos[a[i]]=cnt;
		vis[a[i]]=1;
	 }
	for(RG int i=1, cnt2=0;i<=m;i++) if(!vis[i]) num[cnt+(++cnt2)]=i;
	sum[0]=n;
	for(RG int i=q;i;i--)
	{
		int tt=pos[a[i]];
		if(sum[tt-1])
		{
			sum[tt-1]--;
			sum[tt]++;
		}
	}
	int st=n;
	for(RG int i=0;i<=cnt && st==n;i++) if(sum[i]) st=i;
	for(RG int i=st+2;i<=m;i++)
	 if(num[i]<num[i-1])
	 {
		printf("No\n");
		return 0;
	 }
	printf("Yes\n");
	return 0;
}