#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e6 + 7;
struct node {
  int l, r, s;
} pre[maxn];
int n, k, mx, a[maxn];
void build(int k, int l, int r);
void update(int k, int l, int r);
int query(int k, int l, int r);
int main() {
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    mx = max(mx, a[i]);
  }
  build(1, 1, mx);
  int now = 0, ans = 0;
  for (int i = 1; i <= n; i++) {
    now = query(1, max(0, a[i] - 3), min(mx, a[i] + 3)) + 1;
    ans = max(ans, now);
    update(1, now, now);
  }
  printf("%d\n", ans);
}
void build(int k, int l, int r) {
  pre[k].l = l, pre[k].r = r, pre[k].s = 0;
  if (l >= r) return;
  build(k * 2, l, (l + r) / 2);
  build(k * 2 + 1, (l + r) / 2 + 1, r);
}
void update(int k, int l, int r) {
  if (l <= pre[k].l && pre[k].r <= r) {
    pre[k].s = l;
    return;
  }
  int mid = (pre[k].l + pre[k].r) / 2;
  if (l <= mid) update(k * 2, l, r);
  if (mid + 1 <= r) update(k * 2 + 1, l, r);
  pre[k].s = max(pre[k * 2].s, pre[k * 2 + 1].s);
}
int query(int k, int l, int r) {
  if (pre[k].l <= l && pre[k].r <= r) {
    return pre[k].s;
  }
  int mid = (pre[k].l + pre[k].r) / 2;
  int ans1 = 0, ans2 = 0;
  if (l <= mid) ans1 = query(k * 2, l, r);
  if (mid + 1 <= r) ans2 = query(k * 2 + 1, l, r);
  return max(ans1, ans2);
}
