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 <vector>
#include <functional>

using namespace std;

#define rep(i,n) for(int i=0;i<(n);++i)
const int INF = 1e9;

template<typename T>struct SegTree {
  private:
    using F = function<T(T,T)>;
    int n;
    vector<T> node;
    const F f;
    const T init;
  public:
    SegTree(int size, T init, const F f) : init(init), f(f) {
      n = 1;
      while (n < size) n *= 2;
      node.resize(2*n-1, init);
    }
    void update(int index, T value) {
      index = n - 1 + index;
      node[index] = value;
      while (index != 0) {
        index = (index-1) / 2;
        node[index] = f(node[2*index+1], node[2*index+2]);
      }
    }
    T query(int left, int right, int k = 0, int l = 0, int r = -1) {
      if (r < 0) r = n;
      if (r <= left || right <= l) return init;
      if (left <= l && r <= right) return node[k];
      return f(query(left, right, 2*k+1, l, (l+r)/2), query(left, right, 2*k+2, (l+r)/2, r));
    }
};

int main() {
  int N, K; cin >> N >> K;

  int P[N];
  SegTree<int>
    T_min(N, INF, [](int a, int b){return min(a, b);}),
    T_max(N, -INF, [](int a, int b){return max(a, b);});
  rep(i, N) {
    cin >> P[i];
    T_min.update(i, P[i]); T_max.update(i, P[i]);
  }
  int count[N];
  count[0] = 0;
  rep(i, N-1) count[i+1] = count[i] + (P[i] > P[i+1]);

  int ans = 1;
  bool flag = count[K-1]>0;
  rep(i, N-K) {
    if ((flag || count[i+K] - count[i+1] > 0) &&
        (P[i] != T_min.query(i, i+K+1) || T_max.query(i, i+K+1) != P[i+K])) {
      if (count[i+K] - count[i+1] == 0)
        flag = false;
      ++ans;
    }
  }
  cout << ans << endl;

  return 0;
}