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 Rust (1.15.1) (judge verdict: Accepted)

// The main code is at the very bottom.

#[allow(unused_imports)]
#[macro_use]
pub mod spella {
  #[macro_use]
  mod internal {
    macro_rules! rev {
      ($m:ident [$($t_front:tt)*] [] [$($t_rear:tt)*]) => {
        $m! { $($t_front)* $($t_rear)* }
      };
      ($m:ident [$($t_front:tt)*] [$t_head:tt, $($t_tail:tt,)*] [$($t_rear:tt)*]) => {
        rev! { $m [$($t_front)*] [$($t_tail,)*] [$t_head, $($t_rear)*] }
      };
    }

    macro_rules! __for_each_tuple_internal {
      (@invoke $m:ident! $(($i:tt: $T:ident),)+) => {
        $m! { $($i: $T),+ }
      };
      ($m:ident!) => {};
      ($m:ident! $i0:tt: $T0:ident, $($i:tt: $T:ident,)*) => {
        __for_each_tuple_internal! { $m! $($i: $T,)* }
        rev! { __for_each_tuple_internal [@invoke $m!] [($i0: $T0), $(($i: $T),)*] [] }
      };
    }

    macro_rules! for_each_tuple {
      ($m:ident) => {
        __for_each_tuple_internal! {
          $m! 11: T11, 10: T10, 9: T9, 8: T8, 7: T7, 6: T6, 5: T5, 4: T4, 3: T3, 2: T2, 1: T1, 0: T0,
        }
      };
    }
  }

  pub mod algebra {
    pub mod structures {
      pub use self::abelian_group::*;
      pub use self::associative_magma::*;
      pub use self::commutative_magma::*;
      pub use self::group::*;
      pub use self::invertible_magma::*;
      pub use self::magma::*;
      pub use self::monoid::*;
      pub use self::semigroup::*;
      pub use self::unital_magma::*;

      mod abelian_group {
        use super::{CommutativeMagma, Group};

        pub trait AbelianGroup: Group + CommutativeMagma {}

        impl<T: Group + CommutativeMagma> AbelianGroup for T {}
      }

      mod associative_magma {
        use super::Magma;

        pub trait AssociativeMagma: Magma {}

        impl<T> AssociativeMagma for Option<T> where T: AssociativeMagma {}

        impl AssociativeMagma for () {}

        macro_rules! imp {
          ($($i:tt: $T:ident),*) => {
            impl<$($T),*> AssociativeMagma for ($($T,)*)
            where
              $($T: AssociativeMagma,)*
            {
            }
          }
        }

        for_each_tuple! { imp }
      }

      mod commutative_magma {
        use super::Magma;

        pub trait CommutativeMagma: Magma {}

        impl<T> CommutativeMagma for Option<T> where T: CommutativeMagma {}

        impl CommutativeMagma for () {}

        macro_rules! imp {
          ($($i:tt: $T:ident),*) => {
            impl<$($T),*> CommutativeMagma for ($($T,)*)
            where
              $($T: CommutativeMagma,)*
            {
            }
          }
        }

        for_each_tuple! { imp }
      }

      mod group {
        use super::{AssociativeMagma, InvertibleMagma, UnitalMagma};

        pub trait Group: AssociativeMagma + UnitalMagma + InvertibleMagma {}

        impl<T: AssociativeMagma + UnitalMagma + InvertibleMagma> Group for T {}
      }

      mod invertible_magma {
        use super::{Magma, UnitalMagma};

        pub trait InvertibleMagma: Magma + UnitalMagma {
          fn invert(&self) -> Self;

          fn inverse_op(&self, rhs: &Self) -> Self {
            self.op(&rhs.invert())
          }

          fn inverse_op_assign_right(&mut self, rhs: &Self) {
            *self = self.inverse_op(rhs);
          }

          fn inverse_op_assign_left(&mut self, lhs: &Self) {
            *self = lhs.inverse_op(self);
          }
        }

        impl InvertibleMagma for () {
          fn invert(&self) -> Self {
            ()
          }
        }

        macro_rules! imp {
          ($($i:tt: $T:ident),*) => {
            impl<$($T),*> InvertibleMagma for ($($T,)*)
            where
              $($T: InvertibleMagma,)*
            {
              fn invert(&self) -> Self {
                ($(self.$i.invert(),)*)
              }

              fn inverse_op(&self, rhs: &Self) -> Self {
                ($(self.$i.inverse_op(&rhs.$i),)*)
              }

              fn inverse_op_assign_right(&mut self, rhs: &Self) {
                $(self.$i.inverse_op_assign_right(&rhs.$i);)*
              }

              fn inverse_op_assign_left(&mut self, lhs: &Self) {
                $(self.$i.inverse_op_assign_left(&lhs.$i);)*
              }
            }
          }
        }

        for_each_tuple! { imp }
      }

      mod magma {
        pub trait Magma: Clone {
          fn op(&self, rhs: &Self) -> Self;

          fn op_assign_right(&mut self, rhs: &Self) {
            *self = self.op(rhs);
          }

          fn op_assign_left(&mut self, lhs: &Self) {
            *self = lhs.op(self);
          }
        }

        impl<T> Magma for Option<T>
        where
          T: Magma,
        {
          fn op(&self, rhs: &Self) -> Self {
            match (self, rhs) {
              (&Some(ref lhs), &Some(ref rhs)) => Some(lhs.op(rhs)),
              (&Some(ref value), &None) | (&None, &Some(ref value)) => Some(value.clone()),
              (&None, &None) => None,
            }
          }

          fn op_assign_right(&mut self, rhs: &Self) {
            match (self, rhs.as_ref()) {
              (&mut Some(ref mut lhs), Some(rhs)) => lhs.op_assign_right(rhs),
              (lhs @ &mut None, Some(rhs)) => *lhs = Some(rhs.clone()),
              (_, None) => {}
            }
          }

          fn op_assign_left(&mut self, lhs: &Self) {
            match (lhs.as_ref(), self) {
              (Some(lhs), &mut Some(ref mut rhs)) => rhs.op_assign_left(lhs),
              (Some(lhs), rhs @ &mut None) => *rhs = Some(lhs.clone()),
              (None, _) => {}
            }
          }
        }

        impl Magma for () {
          fn op(&self, _rhs: &Self) -> Self {
            ()
          }
        }

        macro_rules! imp {
          ($($i:tt: $T:ident),*) => {
            impl<$($T),*> Magma for ($($T,)*)
            where
              $($T: Magma,)*
            {
              fn op(&self, rhs: &Self) -> Self {
                ($(self.$i.op(&rhs.$i),)*)
              }

              fn op_assign_right(&mut self, rhs: &Self) {
                $(self.$i.op_assign_right(&rhs.$i);)*
              }

              fn op_assign_left(&mut self, lhs: &Self) {
                $(self.$i.op_assign_left(&lhs.$i);)*
              }
            }
          };
        }

        for_each_tuple! { imp }
      }

      mod monoid {
        use super::{AssociativeMagma, UnitalMagma};

        pub trait Monoid: AssociativeMagma + UnitalMagma {}

        impl<T: AssociativeMagma + UnitalMagma> Monoid for T {}
      }

      mod semigroup {
        use super::AssociativeMagma;

        pub trait Semigroup: AssociativeMagma {}

        impl<T: AssociativeMagma> Semigroup for T {}
      }

      mod unital_magma {
        use super::Magma;

        pub trait UnitalMagma: Magma {
          fn identity() -> Self;
        }

        impl<T> UnitalMagma for Option<T>
        where
          T: Magma,
        {
          fn identity() -> Self {
            None
          }
        }

        impl UnitalMagma for () {
          fn identity() -> Self {
            ()
          }
        }

        macro_rules! imp {
          ($($i:tt: $T:ident),*) => {
            impl<$($T),*> UnitalMagma for ($($T,)*)
            where
              $($T: UnitalMagma,)*
            {
              fn identity() -> Self {
                ($($T::identity(),)*)
              }
            }
          }
        }

        for_each_tuple! { imp }
      }
    }
  }

  pub mod byte {
    pub use self::byte_char::*;
    pub use self::byte_str::*;
    pub use self::byte_string::*;
    pub use self::from_byte_str::*;

    mod byte_char {
      use std::fmt::{self, Debug, Display, Formatter};

      #[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
      pub struct ByteChar(pub u8);

      impl Debug for ByteChar {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          write!(f, "b'{}'", self.0 as char)
        }
      }

      impl Display for ByteChar {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          write!(f, "{}", self.0 as char)
        }
      }
    }

    mod byte_str {
      use spella::byte::{ByteChar, ByteString};
      use std::fmt::{self, Debug, Display, Formatter};
      use std::ops::{Deref, DerefMut};

      #[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
      pub struct ByteStr([ByteChar]);

      macro_rules! cast {
        (mut $x:expr, $($T:ty)=>*) => {
          unsafe { &mut *($x $(as *mut $T)*) }
        };
        ($x:expr, $($T:ty)=>*) => {
          unsafe { &*($x $(as *const $T)*) }
        };
      }

      impl ByteStr {
        pub fn from_bytes(s: &[u8]) -> &Self {
          cast!(s, [u8] => [ByteChar] => ByteStr)
        }

        pub fn from_bytes_mut(s: &mut [u8]) -> &mut Self {
          cast!(mut s, [u8] => [ByteChar] => ByteStr)
        }

        pub fn from_byte_chars(s: &[ByteChar]) -> &Self {
          cast!(s, [ByteChar] => ByteStr)
        }

        pub fn from_byte_chars_mut(s: &mut [ByteChar]) -> &mut Self {
          cast!(mut s, [ByteChar] => ByteStr)
        }

        pub fn as_byte_chars(&self) -> &[ByteChar] {
          &self.0
        }

        pub fn as_byte_chars_mut(&mut self) -> &mut [ByteChar] {
          &mut self.0
        }

        pub fn as_bytes(&self) -> &[u8] {
          cast!(self, ByteStr => [ByteChar] => [u8])
        }

        pub fn as_bytes_mut(&mut self) -> &mut [u8] {
          cast!(mut self, ByteStr => [ByteChar] => [u8])
        }
      }

      impl ToOwned for ByteStr {
        type Owned = ByteString;

        fn to_owned(&self) -> ByteString {
          ByteString::from(self.0.to_owned())
        }
      }

      impl Debug for ByteStr {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          write!(f, "b\"")?;

          for &c in &self.0 {
            write!(f, "{}", c)?;
          }

          write!(f, "\"")
        }
      }

      impl Display for ByteStr {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          for &c in &self.0 {
            write!(f, "{}", c)?;
          }

          Ok(())
        }
      }

      impl Deref for ByteStr {
        type Target = [ByteChar];

        fn deref(&self) -> &[ByteChar] {
          self.as_byte_chars()
        }
      }

      impl DerefMut for ByteStr {
        fn deref_mut(&mut self) -> &mut [ByteChar] {
          self.as_byte_chars_mut()
        }
      }
    }

    mod byte_string {
      use spella::byte::{ByteChar, ByteStr};

      use std::borrow::{Borrow, BorrowMut};
      use std::fmt::{self, Debug, Display, Formatter};
      use std::ops::{Deref, DerefMut};

      #[derive(Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
      pub struct ByteString(Vec<ByteChar>);

      impl ByteString {
        pub fn into_byte_chars(self) -> Vec<ByteChar> {
          self.0
        }

        pub fn as_byte_str(&self) -> &ByteStr {
          ByteStr::from_byte_chars(&self.0)
        }

        pub fn as_mut_byte_str(&mut self) -> &mut ByteStr {
          ByteStr::from_byte_chars_mut(&mut self.0)
        }
      }

      impl From<Vec<ByteChar>> for ByteString {
        fn from(s: Vec<ByteChar>) -> ByteString {
          ByteString(s)
        }
      }

      impl Borrow<ByteStr> for ByteString {
        fn borrow(&self) -> &ByteStr {
          self.as_byte_str()
        }
      }

      impl BorrowMut<ByteStr> for ByteString {
        fn borrow_mut(&mut self) -> &mut ByteStr {
          self.as_mut_byte_str()
        }
      }

      impl Debug for ByteString {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          Debug::fmt(self.as_byte_str(), f)
        }
      }

      impl Display for ByteString {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          Display::fmt(self.as_byte_str(), f)
        }
      }

      impl Deref for ByteString {
        type Target = ByteStr;

        fn deref(&self) -> &ByteStr {
          ByteStr::from_byte_chars(&self.0)
        }
      }

      impl DerefMut for ByteString {
        fn deref_mut(&mut self) -> &mut ByteStr {
          ByteStr::from_byte_chars_mut(&mut self.0)
        }
      }
    }

    mod from_byte_str {
      use spella::byte::{ByteChar, ByteStr, ByteString};

      use std::error::Error;
      use std::fmt::{self, Debug, Display, Formatter};
      use std::str::{self, FromStr, Utf8Error};

      pub trait FromByteStr: Sized {
        type Err;

        fn from_byte_str(s: &ByteStr) -> Result<Self, Self::Err>;
      }

      macro_rules! fn_description {
        () => {
          fn description(&self) -> &str {
            "description() is deprecated; use Display"
          }
        };
      }

      #[derive(Debug)]
      pub struct ParseByteCharError(ParseByteCharErrorKind);

      #[derive(Debug)]
      enum ParseByteCharErrorKind {
        EmptyByteStr,
        TooManyByteChars,
      }

      impl Display for ParseByteCharError {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          use self::ParseByteCharErrorKind::*;

          f.write_str(match self.0 {
            EmptyByteStr => "empty `ByteStr`",
            TooManyByteChars => "too many `ByteChar`s",
          })
        }
      }

      impl Error for ParseByteCharError {
        fn_description! {}
      }

      impl FromByteStr for ByteChar {
        type Err = ParseByteCharError;

        fn from_byte_str(s: &ByteStr) -> Result<Self, Self::Err> {
          use self::ParseByteCharErrorKind::*;

          match s.len() {
            1 => Ok(unsafe { *s.get_unchecked(0) }),
            0 => Err(ParseByteCharError(EmptyByteStr)),
            _ => Err(ParseByteCharError(TooManyByteChars)),
          }
        }
      }

      #[derive(Debug)]
      pub enum ParseByteStringError {}

      impl Display for ParseByteStringError {
        fn fmt(&self, _: &mut Formatter) -> fmt::Result {
          match *self {}
        }
      }

      impl Error for ParseByteStringError {
        fn_description! {}
      }

      impl FromByteStr for ByteString {
        type Err = ParseByteStringError;

        fn from_byte_str(s: &ByteStr) -> Result<Self, Self::Err> {
          Ok(ByteString::from(s.to_vec()))
        }
      }

      pub struct ParseFromStrError<T: FromStr>(ParseFromStrErrorKind<T>);

      enum ParseFromStrErrorKind<T: FromStr> {
        Utf8Error(Utf8Error),
        FromStrError(T::Err),
      }

      impl<T: FromStr> Debug for ParseFromStrError<T>
      where
        T::Err: Debug,
      {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          use self::ParseFromStrErrorKind::*;

          match self.0 {
            Utf8Error(ref err) => f.debug_tuple("Utf8Error").field(err).finish(),
            FromStrError(ref err) => f.debug_tuple("FromStrError").field(err).finish(),
          }
        }
      }

      impl<T: FromStr> Display for ParseFromStrError<T>
      where
        T::Err: Display,
      {
        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
          use self::ParseFromStrErrorKind::*;

          match self.0 {
            Utf8Error(ref err) => write!(f, "{}", err),
            FromStrError(ref err) => write!(f, "{}", err),
          }
        }
      }

      impl<T: FromStr> Error for ParseFromStrError<T>
      where
        T::Err: Debug + Display,
      {
        fn_description! {}
      }

      impl<T: FromStr> FromByteStr for T {
        type Err = ParseFromStrError<T>;

        fn from_byte_str(s: &ByteStr) -> Result<T, Self::Err> {
          use self::ParseFromStrErrorKind::*;

          str::from_utf8(s.as_bytes())
            .map_err(|e| ParseFromStrError(Utf8Error(e)))
            .and_then(|s| s.parse().map_err(|e| ParseFromStrError(FromStrError(e))))
        }
      }
    }
  }

  pub mod io {
    pub use self::scanner::*;

    mod scanner {
      use spella::byte::{ByteStr, FromByteStr};

      use std::io::{self, BufRead};

      #[derive(Debug)]
      pub struct Scanner<R> {
        reader: R,
        buf: Vec<u8>,
        pos: usize,
      }

      const INITIAL_CAPACITY: usize = 32;

      impl<R: BufRead> Scanner<R> {
        pub fn new(reader: R) -> Self {
          Scanner {
            reader: reader,
            buf: Vec::with_capacity(INITIAL_CAPACITY),
            pos: 0,
          }
        }

        pub fn next<T: FromByteStr>(&mut self) -> io::Result<Result<T, T::Err>> {
          self.next_byte_str().map(T::from_byte_str)
        }

        pub fn next_byte_str(&mut self) -> io::Result<&ByteStr> {
          if self.buf.is_empty() {
            self.read_line()?;
          }

          loop {
            match self.buf.get(self.pos) {
              Some(&b' ') => self.pos += 1,
              Some(&b'\n') => self.read_line()?,
              Some(_) => break,
              None => return Err(io::Error::from(io::ErrorKind::UnexpectedEof)),
            }
          }

          let start = self.pos;
          self.pos += 1;

          loop {
            match self.buf.get(self.pos) {
              Some(&b' ') | Some(&b'\n') | None => break,
              Some(_) => self.pos += 1,
            }
          }

          Ok(ByteStr::from_bytes(&self.buf[start..self.pos]))
        }

        fn read_line(&mut self) -> io::Result<()> {
          self.buf.clear();
          self.pos = 0;
          self.reader.read_until(b'\n', &mut self.buf)?;

          Ok(())
        }
      }
    }
  }

  pub mod sequences {
    pub use self::segment_tree::SegmentTree;

    pub mod segment_tree {
      use super::*;
      use spella::algebra::structures::Monoid;

      use std::collections::VecDeque;
      use std::iter::{self, FromIterator};
      use std::mem;
      use std::ops::{Deref, DerefMut, Range};

      #[derive(Clone, PartialEq, Eq, Debug, Hash)]
      pub struct SegmentTree<T> {
        vec: Vec<T>,
        base_len: usize,
        len: usize,
      }

      impl<M: Monoid> FromIterator<M> for SegmentTree<M> {
        fn from_iter<I>(iter: I) -> Self
        where
          I: IntoIterator<Item = M>,
        {
          let iter = iter.into_iter();

          let min_len = iter.size_hint().0;
          let (min_base_len, min_vec_len) = Self::extend_len(min_len);

          let mut deque = VecDeque::with_capacity(min_vec_len);

          if min_base_len > 1 {
            deque.extend(iter::repeat(M::identity()).take(min_base_len - 1));
          }

          deque.extend(iter);

          let len = deque.len() - min_base_len.saturating_sub(1);
          let (base_len, _) = Self::extend_len(len);

          if base_len > min_base_len {
            for identity in iter::repeat(M::identity()).take(base_len - min_base_len) {
              deque.push_front(identity);
            }
          } else if min_base_len > base_len {
            deque.drain(..min_base_len - base_len);
          }

          let mut tree = SegmentTree {
            vec: deque.into(),
            base_len: base_len,
            len: len,
          };

          for node in (1..base_len).rev() {
            tree.recalc(node);
          }

          tree
        }
      }

      impl<M: Monoid> SegmentTree<M> {
        pub fn new(len: usize) -> Self {
          let (base_len, vec_len) = Self::extend_len(len);

          let vec = if vec_len == 0 {
            vec![]
          } else {
            vec![M::identity(); vec_len]
          };

          SegmentTree {
            vec: vec,
            base_len: base_len,
            len: len,
          }
        }

        pub fn len(&self) -> usize {
          self.len
        }

        pub fn get(&self, index: usize) -> &M {
          assert_index(index, self.len());

          self.node(self.node_index(index))
        }

        pub fn get_mut(&mut self, index: usize) -> GetMut<M> {
          assert_index(index, self.len());

          GetMut {
            node: self.node_index(index),
            tree: self,
          }
        }

        pub fn fold(&self, index: Range<usize>) -> M {
          assert_index_range(&index, self.len());

          let mut start = self.node_index(index.start);
          let mut end = self.node_index(index.end);

          let mut lacc = M::identity();
          let mut racc = M::identity();

          while start < end {
            if start & 1 == 1 {
              lacc.op_assign_right(self.node(start));

              start += 1;
            }

            if end & 1 == 1 {
              end -= 1;

              racc.op_assign_left(self.node(end));
            }

            start >>= 1;
            end >>= 1;
          }

          lacc.op(&racc)
        }

        fn extend_len(len: usize) -> (usize, usize) {
          if len == 0 {
            (0, 0)
          } else {
            len
              .checked_next_power_of_two()
              .and_then(|base_len| {
                (base_len - 1)
                  .checked_add(len)
                  .map(|vec_len| (base_len, vec_len))
              })
              .unwrap_or_else(|| panic!("length too large: {:?}", len))
          }
        }

        fn node_index(&self, index: usize) -> usize {
          self.base_len + index
        }

        fn recalc(&mut self, node: usize) {
          let l = node << 1;
          let r = (node << 1) | 1;

          let last = self.vec.len();
          debug_assert_eq!(last, self.node_index(self.len() - 1));

          if l <= last {
            *self.node_mut(node) = if r <= last {
              self.node(l).op(&self.node(r))
            } else {
              self.node(l).clone()
            };
          }
        }

        fn rebuild(&mut self, mut node: usize) {
          while {
            node >>= 1;
            node > 0
          } {
            self.recalc(node);
          }
        }

        fn node(&self, node: usize) -> &M {
          &self.vec[node - 1]
        }

        fn node_mut(&mut self, node: usize) -> &mut M {
          &mut self.vec[node - 1]
        }
      }

      pub struct GetMut<'a, M: 'a + Monoid> {
        tree: &'a mut SegmentTree<M>,
        node: usize,
      }

      impl<'a, M: Monoid> Drop for GetMut<'a, M> {
        fn drop(&mut self) {
          self.tree.rebuild(self.node);
        }
      }

      impl<'a, M: Monoid> Deref for GetMut<'a, M> {
        type Target = M;

        fn deref(&self) -> &M {
          self.tree.node(self.node)
        }
      }

      impl<'a, M: Monoid> DerefMut for GetMut<'a, M> {
        fn deref_mut(&mut self) -> &mut M {
          self.tree.node_mut(self.node)
        }
      }

      impl<'a, M: Monoid> GetMut<'a, M> {
        pub fn update<F>(&mut self, f: F)
        where
          F: FnOnce(M) -> M,
        {
          let value = mem::replace::<M>(self, M::identity());
          mem::replace::<M>(self, f(value));
        }
      }
    }

    use std::ops::{Range, RangeTo};

    macro_rules! assert_index {
      ($cond:expr, $index:expr, $len:expr) => {
        assert!(
          $cond,
          "index out of bounds: the len is {:?} but the index is {:?}",
          $len, $index
        )
      };
    }

    fn assert_index(index: usize, len: usize) {
      assert_index!(index < len, index, len);
    }

    fn assert_index_range(index: &Range<usize>, len: usize) {
      assert!(
        index.start <= index.end,
        "range start is greater than range end: {:?}",
        index
      );
      assert_index!(index.end <= len, index, len);
    }
  }
}

mod prelude {
  pub use spella::byte::{ByteChar, ByteStr, ByteString};
  pub use std::collections::*;
  pub use std::io::prelude::*;
  pub use std::iter::FromIterator;
  pub use std::marker::PhantomData;
  pub use std::num::Wrapping;
  pub use std::ops::{Range, RangeFrom, RangeTo};
  pub use std::{cell, cmp, f64, i32, i64, isize, iter, mem, rc, str, time, u32, u64, usize};
}

use prelude::*;

const CUSTOM_STACK_SIZE_MEBIBYTES: Option<usize> = None;

fn main() {
  fn exec_solver() {
    let stdin = std::io::stdin();
    let stdout = std::io::stdout();
    #[cfg(not(debug_assertions))]
    let mut writer = std::io::BufWriter::new(stdout.lock());
    #[cfg(debug_assertions)]
    let mut writer = stdout.lock();
    solve(stdin.lock(), &mut writer);
    writer.flush().unwrap();
  }

  if let Some(stack_size_mebibytes) = CUSTOM_STACK_SIZE_MEBIBYTES {
    std::thread::Builder::new()
      .name("exec_solver".to_owned())
      .stack_size(stack_size_mebibytes * 1024 * 1024)
      .spawn(exec_solver)
      .unwrap()
      .join()
      .unwrap();
  } else {
    exec_solver();
  }
}

fn solve<R: BufRead, W: Write>(reader: R, mut writer: W) {
  let mut _scanner = spella::io::Scanner::new(reader);

  #[allow(unused_macros)]
  macro_rules! scan {
    ($T:ty) => {
      _scanner.next::<$T>().unwrap().unwrap()
    };
    ($($T:ty),+) => {
      ($(scan!($T)),+)
    };
    ($($T:ty),+; $n:expr $(; $m:expr)*) => {{
      (0..$n).map(|_| scan!($($T),+ $(; $m)*)).collect::<Vec<_>>()
    }};
  }

  #[allow(unused_macros)]
  macro_rules! scan_iter {
    ($($T:ty),+; $n:expr) => {
      (0..$n).map(|_| scan!($($T),+))
    };
  }

  #[allow(unused_macros)]
  macro_rules! print {
    ($fmt:expr) => {
      write!(writer, $fmt).unwrap()
    };
    ($fmt:expr, $($arg:tt)*) => {
      write!(writer, $fmt, $($arg)*).unwrap()
    };
  }

  #[allow(unused_macros)]
  macro_rules! println {
    ($fmt:expr) => {
      writeln!(writer, $fmt).unwrap()
    };
    ($fmt:expr, $($arg:tt)*) => {
      writeln!(writer, $fmt, $($arg)*).unwrap()
    };
  }

  #[allow(unused_macros)]
  macro_rules! eprint {
    ($fmt:expr) => {
      #[cfg(debug_assertions)]
      write!(std::io::stderr(), $fmt).unwrap()
    };
    ($fmt:expr, $($arg:tt)*) => {
      #[cfg(debug_assertions)]
      write!(std::io::stderr(), $fmt, $($arg)*).unwrap()
    };
  }

  #[allow(unused_macros)]
  macro_rules! eprintln {
    ($fmt:expr) => {
      #[cfg(debug_assertions)]
      writeln!(std::io::stderr(), $fmt).unwrap()
    };
    ($fmt:expr, $($arg:tt)*) => {
      #[cfg(debug_assertions)]
      writeln!(std::io::stderr(), $fmt, $($arg)*).unwrap()
    };
  }

  #[allow(unused_macros)]
  macro_rules! dbg {
    ($($x:expr),+) => {{
      eprintln!(concat!("[{}:{}] ", $(stringify!($x), " = {:?}; "),+), file!(), line!(), $($x),+);
    }};
  }

  use spella::algebra::structures::*;
  use spella::sequences::SegmentTree;

  let (n, k) = scan!(usize, usize);
  let p = scan!(u64; n);

  if k == n {
    println!("1");
    return;
  }

  let mut sorted_ranges = HashSet::new();

  {
    let mut i = 0;

    for j in 1..n {
      dbg!(i, j, j - i, k);

      if j - i == k {
        sorted_ranges.insert(i..j);

        if p[j - 1] < p[j] {
          i = i + 1;
        }
      }

      if p[j - 1] > p[j] {
        i = j;
      }
    }

    if n - i == k {
      sorted_ranges.insert(i..n);
    }

    dbg!(sorted_ranges);
  }

  #[derive(Clone, Copy, Debug)]
  struct Min(u64);

  impl Magma for Min {
    fn op(&self, rhs: &Self) -> Self {
      Min(cmp::min(self.0, rhs.0))
    }
  }

  impl AssociativeMagma for Min {}

  impl UnitalMagma for Min {
    fn identity() -> Self {
      Min(u64::max_value())
    }
  }

  #[derive(Clone, Copy, Debug)]
  struct Max(u64);

  impl Magma for Max {
    fn op(&self, rhs: &Self) -> Self {
      Max(cmp::max(self.0, rhs.0))
    }
  }

  impl AssociativeMagma for Max {}

  impl UnitalMagma for Max {
    fn identity() -> Self {
      Max(u64::min_value())
    }
  }

  let min_segtree = SegmentTree::from_iter(p.iter().cloned().map(Min));
  let max_segtree = SegmentTree::from_iter(p.iter().cloned().map(Max));

  let first_range_is_sorted = sorted_ranges.contains(&(0..k));

  let mut cnt = if first_range_is_sorted { 0 } else { 1 };
  let mut sorted_cnt = if first_range_is_sorted { 1 } else { 0 };

  for i in 1..n - k + 1 {
    let Min(min_) = min_segtree.fold(i - 1..i + k);
    let Max(max_) = max_segtree.fold(i - 1..i + k);

    dbg!(i, min_, max_, p[i - 1], p[i - 1 + k]);

    if min_ != p[i - 1] || max_ != p[i - 1 + k] {
      dbg!(i..i + k);

      if sorted_ranges.contains(&(i..i + k)) {
        sorted_cnt += 1;
      } else {
        cnt += 1;
      }
    }
  }

  dbg!(cnt, sorted_cnt);

  let ans = cnt + cmp::min(1, sorted_cnt);

  println!("{}", ans);
}