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

#include <iostream>
#include <set>
#define llint long long

using namespace std;

llint n, k;
llint p[200005];
llint d[200005], sumd[200005];
set<llint> S;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> k;
	for(int i = 1; i <= n; i++) cin >> p[i];
	
	p[0] = -100000;
	for(int i = 1; i <= n; i++){
		if(p[i-1] > p[i]) d[i] = 1;
	}
	for(int i = 1; i <= n; i++) sumd[i] = sumd[i-1] + d[i];
	
	llint ans = (n-k+1); bool flag = false;
	for(int i = 1; i+k-1 <= n; i++){
		if(sumd[i+k-1] - sumd[i] == 0) ans--, flag = true;
	}
	if(flag) ans++;
	//cout << ans << endl;
	
	bool premin = false, premax = false;
	bool curmin = false, curmax = false;
	for(int i = 1; i <= k-1; i++) S.insert(p[i]);
	for(int i = 1; i+k-1 <= n; i++){
		S.insert(p[i+k-1]);
		if(*S.begin() == p[i]) curmin = true;
		auto it = S.end(); it--;
		if(*it == p[i+k-1]) curmax = true;
		
		if(sumd[i+k-1] - sumd[i] != 0){
			if(premin && curmax) ans--;
		}
		//cout << i << " " << curmin << " " << curmax << endl;
		premin = curmin, premax = curmax;
		curmin = curmax = false;
		S.erase(p[i]);
		//cout << i << " " << ans << endl;
	}
	cout << ans << endl;
	
	return 0;
}