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: Wrong Answer)

#include<stdio.h>
int max(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}
int min(int a, int b)
{
	if (a < b)
		return a;
	else
		return b;
}
int segmax[1000006], segmin[1000006];
int m;
int getmax(int l, int r)
{
	l += m;
	r += m;
	int res = 0;
	while (r != l)
	{
		if (l % 2 == 0)
			res = max(res, segmax[l]);
		l = (l - 1) / 2;
		if (r % 2 > 0)
			res = max(res, segmax[r]);
		r = (r - 1) / 2;
	}
	res = max(res, segmax[r]);
	return res;
}
int getmin(int l, int r)
{
	l += m;
	r += m;
	int res = 0;
	while (r != l)
	{
		if (l % 2 == 0)
			res = min(res, segmin[l]);
		l = (l - 1) / 2;
		if (r % 2 > 0)
			res = min(res, segmin[r]);
		r = (r - 1) / 2;
	}
	res = min(res, segmin[r]);
	return res;
}
int main()
{
	int n, k;
	scanf("%d %d", &n, &k);
	int i;
	int p[200005];
	for (i = 0; i < n; i++)
		scanf("%d", &p[i]);
	if (n == k)
	{
		printf("1\n");
		return 0;
	}
	int count[200005];
	count[0] = 1;
	for (i = 1; i < n; i++)
	{
		if (p[i - 1] < p[i])
			count[i] = count[i - 1] + 1;
		else
			count[i] = 1;
	}
	m = 1;
	while (m < n)
		m *= 2;
	for (i = 0; i < 2 * m - 1; i++)
		segmax[i] = 0;
	for (i = 0; i < n; i++)
		segmax[i + m - 1] = p[i];
	for (i = m - 2; i >= 0; i--)
		segmax[i] = max(segmax[2 * i + 1], segmax[2 * i + 2]);
	for (i = 0; i < 2 * m - 1; i++)
		segmin[i] = n;
	for (i = 0; i < n; i++)
		segmin[i + m - 1] = p[i];
	for (i = m - 2; i >= 0; i--)
		segmin[i] = min(segmin[2 * i + 1], segmin[2 * i + 2]);
	int ans = n - k + 1;
	for (i = 0; i < n - k; i++)
	{
		if (p[i] == getmin(i, i + k) && p[i + k] == getmax(i, i + k))
			ans--;
		else if (count[i + k] >= k)
			ans--;
	}
	int c = 0;
	for (i = 0; i < n; i++)
		if (count[i] >= k)
			c++;
	if (c > 0)
		ans++;
	printf("%d\n", ans);
	return 0;
}