/*
貪欲
後ろから見る
DP
順位表をチェック
二分探索


*/
#pragma GCC optimize("Ofast")
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include <bitset>
#include <cmath>
#include <limits>
#include <iostream>
#include <map>
#include<tuple>
using namespace std;
#define INF 3e18+7
#define MAX 210000
#define MIN -1
#define MOD 1000000007
typedef long long ll;
//typedef pair<int,int> P;
//typedef pair<pair<int,int>,int> p;
#define bit(n,k) ((n>>k)&1) /*nのk bit目*/
#define rad_to_deg(rad) (((rad)/2/M_PI)*360)
struct edge{ll to,cost,val;};
template<class T,class U>bool chmin(T&a,const U&b){if(a<=b)return false;a=b;return true;}
template<class T,class U>bool chmax(T&a,const U&b){if(a>=b)return false;a=b;return true;}
//__builtin_popcount(S);
//C.erase(unique(C.begin(),C.end()),C.end());

const int MAX_N=1<<20;

//セグメント木を持つグローバル配列
int n,dat[2*MAX_N-1],dat2[2*MAX_N-1];

//初期化
void init(int n_){
    //簡単のために要素数を2のべき乗に
    n=1;
    while(n<n_) n*=2;

    //全ての値をINT_MAXに
    for(int i=0;i<2*n-1;i++) dat[i]=MAX;
}

//k番目の値(0-indexed)をaに変更
void update(int k,int a){
    //葉の節点
    k+=n-1;
    dat[k]=a;
    //登りながら更新
    while(k>0){
        k=(k-1)/2;
        dat[k]=min(dat[k*2+1],dat[k*2+2]);
    }
}

//[a,b)の最小値を求める
//後ろの方の引数は、計算の簡単のための引数
//ｋは接点の番号、l,rはその接点が[l,r)に対応づいていることを表す
//したがって、外からはquery(a,b,0,0,n)として呼ぶ
int query(int a,int b,int k,int l,int r){
    //[a,b)と[l,r)が交差しなければ,INT_MAX
    if(r<=a || b<=l) return MAX;

    //[a,b)が[l,r)を完全に含んでいれば、この節点の値
    if(a<=l && r<=b) return dat[k];
    else{
        //そうでなければ、２つの子の最小値
        int vl=query(a,b,k*2+1,l,(l+r)/2);
        int vr=query(a,b,k*2+2,(l+r)/2,r);
        return min(vl,vr);
    }
}

//初期化
void init2(ll n_){
    //簡単のために要素数を2のべき乗に
    n=1;
    while(n<n_) n*=2;

    //全ての値をINT_MAXに
    for(int i=0;i<2*n-1;i++) dat2[i]=-1;
}

//k番目の値(0-indexed)をaに変更
void update2(int k,int a){
    //葉の節点
    k+=n-1;
    dat2[k]=a;
    //登りながら更新
    while(k>0){
        k=(k-1)/2;
        dat2[k]=max(dat2[k*2+1],dat2[k*2+2]);
    }
}

//[a,b)の最小値を求める
//後ろの方の引数は、計算の簡単のための引数
//ｋは接点の番号、l,rはその接点が[l,r)に対応づいていることを表す
//したがって、外からはquery(a,b,0,0,n)として呼ぶ
int query2(int a,int b,int k,int l,int r){
    //[a,b)と[l,r)が交差しなければ,INT_MAX
    if(r<=a || b<=l) return -1;

    //[a,b)が[l,r)を完全に含んでいれば、この節点の値
    if(a<=l && r<=b) return dat2[k];
    else{
        //そうでなければ、２つの子の最小値
        int vl=query2(a,b,k*2+1,l,(l+r)/2);
        int vr=query2(a,b,k*2+2,(l+r)/2,r);
        return max(vl,vr);
    }
}



int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N,K,P[210000];
    cin>>N>>K;
    init(N+1);
    init2(N+1);
    for(int i=0;i<N;i++){
        cin>>P[i];
        update(i,P[i]);
        update2(i,P[i]);
    }
    int ans=1;
    vector<int> cnt(N+1);
    for(int i=0;i<N;i++) cnt[i+1]=cnt[i]+(P[i]>P[i+1]);
    bool flag=true;
    if(cnt[K-1]==0) flag=false;

    for(int i=0;i<N-K;i++){
        int x=query(i,i+K+1,0,0,n);
        int y=query2(i,i+K+1,0,0,n);
        if(cnt[i+K]-cnt[i+1]==0){
            if(flag) ans++;
            flag=false;
            continue;
        }
        if(x==P[i] && y==P[i+K]) continue;
        else ans++;
        //cout<<i<<" "<<x<<" "<<y<<endl;
    }

    cout<<ans<<endl;
}

Measured memory_bytes: 9984