Problem:
Score : 700 points

Problem Statement

Snuke has a permutation (P_0,P_1,\cdots,P_{N-1}) of (0,1,\cdots,N-1).

Now, he will perform the following operation exactly once:

Choose K consecutive elements in P and sort them in ascending order.

Find the number of permutations that can be produced as P after the operation.

Constraints

2 \leq N \leq 200000

2 \leq K \leq N

0 \leq P_i \leq N-1

P_0,P_1,\cdots,P_{N-1} are all different.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K
P_0 P_1 \cdots P_{N-1}

Output

Print the number of permutations that can be produced as P after the operation.

Sample Input 1

5 3
0 2 1 4 3

Sample Output 1

2

Two permutations can be produced as P after the operation: (0,1,2,4,3) and (0,2,1,3,4).

Sample Input 2

4 4
0 1 2 3

Sample Output 2

1

Sample Input 3

10 4
2 0 1 3 7 5 4 6 8 9

Sample Output 3

6

Solution in C (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int asc(const void* a, const void* b){
    return *(int*)a - *(int*)b;
}

int main(){
	int N,K;
	scanf("%d %d\n",&N,&K);
	int *P;
	P = (int*)malloc(N*sizeof(int));
	int i,j;
	for(i=0;i<N;i++){
		scanf("%d",&P[i]);
	}
    int num_of_trial = N-K+1;

    int *buff;
    buff = malloc(K*sizeof(int));
    int **seg_sorted;
    seg_sorted = malloc(num_of_trial*sizeof(int*));

    int num_of_idential=0;
    int judge=0;
    int ans=0;

    for(i=0;i<num_of_trial;i++){
        seg_sorted[i]=malloc(N*sizeof(int));
        memcpy(seg_sorted[i],P,i*sizeof(int));
        memcpy(buff,&P[i],K*sizeof(int));
        qsort(buff,K,sizeof(int),asc);
        memcpy((seg_sorted[i]+i),buff,K*sizeof(int));
        memcpy((seg_sorted[i]+i+K),&P[i+K],(N-(i+K))*sizeof(int));
        if(memcmp(seg_sorted[i],P,N*sizeof(int))==0){
            num_of_idential++;
        }else{
            for(j=i-1;(j>=0)&(j>i-K);j--){
                if(memcmp(seg_sorted[i],seg_sorted[j],N*sizeof(int))==0){
                    judge++;
                }
            }
            if(judge==0){
                ans++;
            }
            judge=0;
        }
        if(i-K>=0){
            free(seg_sorted[i-K]);
        }
    }
    if(num_of_idential>0){
        ans++;
    }
    printf("%d",ans);
	return 0;
}