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

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define endl '\n';
#define FASTER ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
const ll POSITIVE_INFINITY = 9223372036854775807;
const ll NEGATIVE_INFINITY = -9223372036854775807;
const ll MOD = 1000000007;
const ld PI = acos(-1.0);

template <typename T> inline T bigMod(T A,T B,T M = MOD){A %= M;T ret = 1;while(B){if(B & 1) ret = (ret * A) % M;A = (A * A) % M;B = B >> 1;}return ret;}
template <typename T> inline T invMod (T A,T M = MOD){return bigMod(A,M-2,M);}

const int N = 200005;

int main(){
  FASTER;
  int n, k;
  cin >> n >> k;
  vector<int>ar(n);
  for (int i = 0; i < n; i++){
    cin >> ar[i];
  }
  int cnt = 1;
  vector<int>asc(n);
  asc[0] = 1;
  for (int i = 1; i < n; i++){
    if (ar[i] > ar[i - 1]){
      cnt++;
    }
    else {
      cnt = 1;
    }
    asc[i] = cnt;
  }
  bool f = false;
  for (int i = k - 1; i < n; i++){
    if (asc[i] >= k){
      f = true;
    }
  }
  vector<int>mx(n), mn(n);
  set<int, greater<int> >s_max;
  set<int>s_min;
  for (int i = 0; i < n; i++){
    s_max.insert(ar[i]);
    s_min.insert(ar[i]);
    if (i - k >= 0){
      s_max.erase(s_max.find(ar[i - k]));
      s_min.erase(s_min.find(ar[i - k]));
    }
    mx[i] = *s_max.begin();
    mn[i] = *s_min.begin();
  }
  int ans = 0;
  for (int i = k - 1; i < n; i++){
    //cout << i << " ";
    if (asc[i] >= k){
      //cout << "ASC " << i << endl;
      continue;
    }
    if (i != k - 1 && mx[i] == ar[i] && mn[i - k] == ar[i - k]){
      continue;
    }
    ans++;
    //cout << i << "\n";
  }
  cout << ans + f << "\n";
  return 0;
}