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<bits/stdc++.h>
using namespace std;
typedef long long ll;

int N,M,Q,a[100000],tree[1<<18],c[100001];
bool b[100001];
vector<int>v;
map<int,int>mp;

void add(int x,int t){
	x+=(1<<17);
	while(x){
		tree[x]+=t;
		x/=2;
	}
}

int calc(int p,int q,int l,int r,int k){
	if(r<p||q<l)return 0;
	if(p<=l&&r<=q)return tree[k];
	else{
		return (calc(p,q,l,(l+r)/2,k*2)+calc(p,q,(l+r)/2+1,r,k*2+1));
	}
}

int main(){
	cin>>N>>M>>Q;
	for(int i=0;i<Q;++i){
		cin>>a[i];
	}
	for(int i=Q-1;i>=0;--i){
		if(b[a[i]])continue;
		v.push_back(a[i]);
		b[a[i]]=true;
	}
	for(int i:v){
		add(i,1);
	}
	while(!v.empty()){
		if(calc(0,v.back(),0,(1<<17)-1,1)==v.back()){
			add(v.back(),-1);
			v.pop_back();
		}
		else{
			break;
		}
	}
	c[0]=N;
	for(int i=0;i<v.size();++i){
		mp[v[i]]=i;
	}
	for(int i=Q-1;i>=0;--i){
		if(mp.find(a[i])!=mp.end()){
			int t=mp[a[i]];
			if(c[t]){
				--c[t];
				++c[t+1];
			}
		}
	}
	if(c[v.size()]==N){
		cout<<"Yes"<<endl;
	}
	else{
		cout<<"No"<<endl;
	}
}