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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
class Solve{
    int n;
    int m;
    int q;
    int[] a;
    public Solve(){}
    public static int Main(){
        new Solve().Calc();
        return 0;
    }
    void Calc(){
        getinput();
        bool[] check = new bool[m];
        int[] counts = new int[m];
        int[] place = new int[m];
        int[] s = new int[m];
        int count = m-2;
        for(int i=0;i<m;i++){
            check[i]=false;
            counts[i] = 0;
        }
        {
            int j = 0;
            for(int i=q-1;i>=0;i--){
                if(!check[a[i]]){
                    check[a[i]] = true;
                    place[a[i]] = j;
                    s[j] = a[i];
                    j++;
                }
            }
            for(int i=0;i<m;i++){
                if(!check[i]){
                    place[i] = j;
                    s[j] = i;
                    j++;
                }
            }
        }
        for(int i =  q-1;i>=0;i--){
            if(counts[place[a[i]]]<n){
                if(place[a[i]] == 0 || counts[place[a[i]]-1] > counts[place[a[i]]]){
                    counts[place[a[i]]]++;
                }
            }
        }
        while(count >= 0){
            if(s[count]<s[count+1]){
                count--;
            }
            else{
                break;
            }
        }
        if(count>=0 && counts[count]<n){
            Console.WriteLine("No");
        }
        else{
            Console.WriteLine("Yes");
        }
        // for(int i=0;i<=count;i++){
        //     if(counts[i]<n){
        //         Console.WriteLine("No");
        //         return;
        //     }
        // }
        // Console.WriteLine("Yes");
    }
    void getinput(){
        string[] str = Console.ReadLine().Split(' ');
        n = int.Parse(str[0]);
        m = int.Parse(str[1]);
        q = int.Parse(Console.ReadLine());
        str = Console.ReadLine().Split(' ');
        a = new int[q];
        for(int i=0;i<q;i++){
            a[i] = int.Parse(str[i])-1;
        }
    }    
}