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

using System;
using System.Linq;

class B
{
	static void Main()
	{
		Func<int[]> read = () => Console.ReadLine().Split().Select(int.Parse).ToArray();
		var h = read();
		var p = read();
		int n = h[0], k = h[1];

		var smin = Slide(p, k + 1, (x, y) => x <= y);
		var smax = Slide(p, k + 1, (x, y) => x >= y);
		var c = n - k + 1 - Enumerable.Range(0, n - k).Count(i => smin[i] == p[i] && smax[i] == p[i + k]);

		int c2 = 0, t = 1;
		for (int i = 1; i < n; i++)
		{
			if (p[i] > p[i - 1]) t++;
			else
			{
				if (t >= k) c2++;
				t = 1;
			}
		}
		if (t >= k) c2++;

		Console.WriteLine(c - Math.Max(c2 - 1, 0));
	}

	static int[] Slide(int[] a, int k, Func<int, int, bool> c)
	{
		var r = new int[a.Length - k + 1];
		var q = new int[a.Length];
		for (int i = 1 - k, j = 0, s = 0, t = -1; j < a.Length; i++, j++)
		{
			while (s <= t && c(a[j], a[q[t]])) t--;
			q[++t] = j;
			if (i < 0) continue;
			r[i] = a[q[s]];
			if (q[s] == i) s++;
		}
		return r;
	}
}