#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace __gnu_pbds;

#if !ONLINE_JUDGE
#define debug
#endif

using namespace std;
 
/*******  All Required define Pre-Processors and typedef Constants *******/
#define mem(a, b) memset(a, (b), sizeof(a))
#define repd(i,k) for(int i=k;i>=0;i--)
#define rep(i,k) for(int i=0;i<k;i++)
#define repn(i,k1,k2) for(ll i=k1;i<k2;i++)
#define sz(x) (ll)(x).size()
#define ff first
#define ss second

#define all(cont) cont.begin(), cont.end()
#define rall(cont) cont.end(), cont.begin()
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define INF (int)1e9
#define EPS 1e-9
#define PI 3.1415926535897932384626433832795
#define MOD 1000000007
#define ee6 (ll)1000001
#define ee5 (ll)100001

#define trav(a, v) for(auto& a : v)

#define tt ll t;cin>>t; while(t--)
typedef long long int ll;
 
typedef pair<ll, ll> pr;
typedef vector<ll> vi;
typedef vector<string> vs;
typedef vector<pr> vpr;
typedef vector<vpr>vvpr;
typedef vector<vi> vvi;

//*X.find_by_order(2) element at index=2
//X.order_of_key(1) how many elements strictly less than 1

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
    tree_order_statistics_node_update>;

#ifdef debug
#define dbg(...) { cerr<<"[ "; dump(#__VA_ARGS__, __VA_ARGS__);}
#undef endl
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const pair<Arg1,Arg2> &x) {
    return out<<"("<<x.ff<<","<<x.ss<<")";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const vector<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const set<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const unordered_map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
} 
 
template <typename Arg1>
void dump(const string name, Arg1&& arg1){
    cerr << name << " : " << arg1 << " ] " << endl;
}
 
template <typename Arg1, typename... Args>
void dump(const string names, Arg1&& arg1, Args&&... args){
    const string name = names.substr(0,names.find(','));
    cerr<<name<<" : "<<arg1<<" | ";
    dump(names.substr(1+(int)name.size()), args...);
}
#else
    #define dbg(args...)
#endif
 
ll powmod(ll x, ll y) 
{ 
    ll res = 1;  
    x = x % MOD;
    while (y > 0) 
    { 
        if (y & 1) 
          res = (res*x) % MOD; 
        y = y>>1; // y = y/2 
        x = (x*x) % MOD;   
    } 
    return res; 
} 
template<class T>
struct RMaxQ {
  vector<vector<T>> jmp;

  RMaxQ(const vector<T>& V) {
    int N = sz(V), on = 1, depth = 1;
    while (on < sz(V)) on *= 2, depth++;
    jmp.assign(depth, V);
    rep(i,depth-1) rep(j,N)
      jmp[i+1][j] = max(jmp[i][j],
      jmp[i][min(N - 1, j + (1 << i))]);
  }

  T query(int a, int b) {
    b++;
    assert(a < b); // or return inf if a == b
    int dep = 31 - __builtin_clz(b - a);
    return max(jmp[dep][a], jmp[dep][b - (1 << dep)]);
  }
};

template<class T>
struct RMQ {
  vector<vector<T>> jmp;

  RMQ(const vector<T>& V) {
    int N = sz(V), on = 1, depth = 1;
    while (on < sz(V)) on *= 2, depth++;
    jmp.assign(depth, V);
    rep(i,depth-1) rep(j,N)
      jmp[i+1][j] = min(jmp[i][j],
      jmp[i][min(N - 1, j + (1 << i))]);
  }

  T query(int a, int b) {
    b++;
    assert(a < b); // or return inf if a == b
    int dep = 31 - __builtin_clz(b - a);
    return min(jmp[dep][a], jmp[dep][b - (1 << dep)]);
  }
};

int l[2*ee5];
int main(){
//  freopen("in.txt","r",stdin);
  int n,k;
  cin>>n>>k;
  vector<int>v(n);
  rep(i,n){
    cin>>v[i];
  }

  stack<int>st;
  for(int i=0;i<n;i++){
    while(!st.empty() and v[i]<v[st.top()])
      st.pop();
    if(st.empty())
      l[i]=INF;
    else l[i]=i-st.top();
    l[i]+=i?l[i-1]:0;
    st.push(i);
  }


  RMaxQ<int>rmaxq(v);
  RMQ<int>rmq(v);
  int cnt=1;
  bool found=false;
  for(int i=k;i<n;i++){    
    
    if(rmaxq.query(i-k+1,i)==v[i] and rmq.query(i-k,i-1)==v[i-k])continue;    
    else if(l[i]-l[i-k+1]==k-1){found=true;continue;}
      //i-k+1 i
    else cnt++;
  }
  if(found and (l[k-1]-l[0]!=k-1))cnt++;
  cout<<cnt;
}

Measured memory_bytes: 32384