class SegTree:  # 0-index !!!

    """

    fx: モノイドXでの二項演算

    ex: モノイドXでの単位元

    init(seq, fx, ex): 配列seqで初期化 O(N)

    update(i, x): i番目の値をxに更新 O(logN)

    query(l, r): 区間[l,r)をfxしたものを返す O(logN)

    get(i): i番目の値を返す

    show(): 配列を返す

    """



    def __init__(self, seq, fx, ex):

        self.n = len(seq)

        self.fx = fx

        self.ex = ex

        self.size = 1<<(self.n - 1).bit_length()

        self.tree = [ex] * (self.size * 2)

        # build

        for i, x in enumerate(seq, start=self.size):

            self.tree[i] = x

        for i in reversed(list(range(1, self.size))):

            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])



    def set(self, i, x):  # O(log(n))

        i += self.size

        self.tree[i] = x

        while i:

            i >>= 1

            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])



    def update(self, i, x):

        i += self.size

        self.tree[i] = x

        while i > 1:

            i >>= 1

            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])



    def query(self, l, r):  # l = r の場合はたぶんバグるので注意

        tmp_l = self.ex

        tmp_r = self.ex

        l += self.size

        r += self.size

        while l < r:

            if l & 1:

                tmp_l = self.fx(tmp_l, self.tree[l])

                l += 1

            if r & 1:

                tmp_r = self.fx(self.tree[r - 1], tmp_r)  # 交換法則を仮定しない(順序大事に)

            l >>= 1

            r >>= 1

        return self.fx(tmp_l, tmp_r)



    def get(self, i):

        return self.tree[self.size + i]



    def show(self):

        return self.tree[self.size: self.size + self.n]



# ---------------------- #



n, k = (int(x) for x in input().split())

P = list(int(x) for x in input().split())



min_seg = SegTree(P, fx=min, ex=10**18)

max_seg = SegTree(P, fx=max, ex=0)



asc_count = [1] * n

for i in range(1, n):

    if P[i] > P[i - 1]:

        asc_count[i] = asc_count[i - 1] + 1



ans = 0

no_count = 0

min_out_flag = False

for i in range(n - k + 1):

    if not min_out_flag or P[i + k - 1] != max_seg.query(i, i + k):

        ans += 1

        if asc_count[i + k - 1] >= k:

            no_count += 1

    if P[i] == min_seg.query(i, i + k):

        min_out_flag = True

    else:

        min_out_flag = False

print((ans - max(no_count - 1, 0)))

class SegTree:  # 0-index !!!

    def __init__(self, seq, fx, ex):

        self.n = len(seq)

        self.fx = fx

        self.ex = ex

        self.size = 1<<(self.n - 1).bit_length()

        self.tree = [ex] * (self.size * 2)

        # build

        for i, x in enumerate(seq, start=self.size):

            self.tree[i] = x

        for i in reversed(list(range(1, self.size))):

            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])



    def update(self, i, x):

        i += self.size

        self.tree[i] = x

        while i > 1:

            i >>= 1

            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])



    def query(self, l, r):

        tmp_l = self.ex

        tmp_r = self.ex

        l += self.size

        r += self.size

        while l < r:

            if l & 1:

                tmp_l = self.fx(tmp_l, self.tree[l])

                l += 1

            if r & 1:

                tmp_r = self.fx(self.tree[r - 1], tmp_r)  # 交換法則を仮定しない(順序大事に)

            l >>= 1

            r >>= 1

        return self.fx(tmp_l, tmp_r)



# ---------------------- #



n, k = (int(x) for x in input().split())

P = list(int(x) for x in input().split())



min_seg = SegTree(P, fx=min, ex=10**18)

max_seg = SegTree(P, fx=max, ex=0)



asc_count = [1] * n

for i in range(1, n):

    if P[i] > P[i - 1]:

        asc_count[i] = asc_count[i - 1] + 1



ans = 1

no_count = 0

if asc_count[k - 1] >= k:

    no_count += 1

for i in range(1, n - k + 1):

    if P[i - 1] != min_seg.query(i - 1, i + k - 1) or P[i + k - 1] != max_seg.query(i, i + k):

        ans += 1

        if asc_count[i + k - 1] >= k:

            no_count += 1



print((ans - max(no_count - 1, 0)))

class SegTree:  # 0-index !!!
    """
    fx: モノイドXでの二項演算
    ex: モノイドXでの単位元
    init(seq, fx, ex): 配列seqで初期化 O(N)
    update(i, x): i番目の値をxに更新 O(logN)
    query(l, r): 区間[l,r)をfxしたものを返す O(logN)
    get(i): i番目の値を返す
    show(): 配列を返す
    """

    def __init__(self, seq, fx, ex):
        self.n = len(seq)
        self.fx = fx
        self.ex = ex
        self.size = 1 << (self.n - 1).bit_length()
        self.tree = [ex] * (self.size * 2)
        # build
        for i, x in enumerate(seq, start=self.size):
            self.tree[i] = x
        for i in reversed(list(range(1, self.size))):
            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])

    def set(self, i, x):  # O(log(n))
        i += self.size
        self.tree[i] = x
        while i:
            i >>= 1
            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])

    def update(self, i, x):
        i += self.size
        self.tree[i] = x
        while i > 1:
            i >>= 1
            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])

    def query(self, l, r):  # l = r の場合はたぶんバグるので注意
        tmp_l = self.ex
        tmp_r = self.ex
        l += self.size
        r += self.size
        while l < r:
            if l & 1:
                tmp_l = self.fx(tmp_l, self.tree[l])
                l += 1
            if r & 1:
                tmp_r = self.fx(self.tree[r - 1], tmp_r)  # 交換法則を仮定しない(順序大事に)
            l >>= 1
            r >>= 1
        return self.fx(tmp_l, tmp_r)

    def get(self, i):
        return self.tree[self.size + i]

    def show(self):
        return self.tree[self.size : self.size + self.n]


# ---------------------- #
n, k = (int(x) for x in input().split())
P = list(int(x) for x in input().split())
min_seg = SegTree(P, fx=min, ex=10**18)
max_seg = SegTree(P, fx=max, ex=0)
asc_count = [1] * n
for i in range(1, n):
    if P[i] > P[i - 1]:
        asc_count[i] = asc_count[i - 1] + 1
ans = 0
no_count = 0
min_out_flag = False
for i in range(n - k + 1):
    if not min_out_flag or P[i + k - 1] != max_seg.query(i, i + k):
        ans += 1
        if asc_count[i + k - 1] >= k:
            no_count += 1
    if P[i] == min_seg.query(i, i + k):
        min_out_flag = True
    else:
        min_out_flag = False
print((ans - max(no_count - 1, 0)))

class SegTree:  # 0-index !!!
    def __init__(self, seq, fx, ex):
        self.n = len(seq)
        self.fx = fx
        self.ex = ex
        self.size = 1 << (self.n - 1).bit_length()
        self.tree = [ex] * (self.size * 2)
        # build
        for i, x in enumerate(seq, start=self.size):
            self.tree[i] = x
        for i in reversed(list(range(1, self.size))):
            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])

    def update(self, i, x):
        i += self.size
        self.tree[i] = x
        while i > 1:
            i >>= 1
            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1])

    def query(self, l, r):
        tmp_l = self.ex
        tmp_r = self.ex
        l += self.size
        r += self.size
        while l < r:
            if l & 1:
                tmp_l = self.fx(tmp_l, self.tree[l])
                l += 1
            if r & 1:
                tmp_r = self.fx(self.tree[r - 1], tmp_r)  # 交換法則を仮定しない(順序大事に)
            l >>= 1
            r >>= 1
        return self.fx(tmp_l, tmp_r)


# ---------------------- #
n, k = (int(x) for x in input().split())
P = list(int(x) for x in input().split())
min_seg = SegTree(P, fx=min, ex=10**18)
max_seg = SegTree(P, fx=max, ex=0)
asc_count = [1] * n
for i in range(1, n):
    if P[i] > P[i - 1]:
        asc_count[i] = asc_count[i - 1] + 1
ans = 1
no_count = 0
if asc_count[k - 1] >= k:
    no_count += 1
for i in range(1, n - k + 1):
    if P[i - 1] != min_seg.query(i - 1, i + k - 1) or P[i + k - 1] != max_seg.query(
        i, i + k
    ):
        ans += 1
        if asc_count[i + k - 1] >= k:
            no_count += 1
print((ans - max(no_count - 1, 0)))

-    """ -    fx: モノイドXでの二項演算 -    ex: モノイドXでの単位元 -    init(seq, fx, ex): 配列seqで初期化 O(N) -    update(i, x): i番目の値をxに更新 O(logN) -    query(l, r): 区間[l,r)をfxしたものを返す O(logN) -    get(i): i番目の値を返す -    show(): 配列を返す -    """ - -    def set(self, i, x):  # O(log(n)) -        i += self.size -        self.tree[i] = x -        while i: -            i >>= 1 -            self.tree[i] = self.fx(self.tree[2 * i], self.tree[2 * i + 1]) - -    def query(self, l, r):  # l = r の場合はたぶんバグるので注意 +    def query(self, l, r): -    def get(self, i): -        return self.tree[self.size + i] - -    def show(self): -        return self.tree[self.size : self.size + self.n] - -ans = 0 +ans = 1 -min_out_flag = False -for i in range(n - k + 1): -    if not min_out_flag or P[i + k - 1] != max_seg.query(i, i + k): +if asc_count[k - 1] >= k: +    no_count += 1 +for i in range(1, n - k + 1): +    if P[i - 1] != min_seg.query(i - 1, i + k - 1) or P[i + k - 1] != max_seg.query( +        i, i + k +    ): -    if P[i] == min_seg.query(i, i + k): -        min_out_flag = True -    else: -        min_out_flag = False