Problem: You are a coach at your local university. There are n students under your supervision, the programming skill of the i-th student is a_i.

You have to create a team for a new programming competition. As you know, the more students some team has the more probable its victory is! So you have to create a team with the maximum number of students. But you also know that a team should be balanced. It means that the programming skill of each pair of students in a created team should differ by no more than 5.

Your task is to report the maximum possible number of students in a balanced team.

Input

The first line of the input contains one integer n (1 ≤ n ≤ 2 ⋅ 10^5) — the number of students.

The second line of the input contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 10^9), where a_i is a programming skill of the i-th student.

Output

Print one integer — the maximum possible number of students in a balanced team.

Examples

Input


6
1 10 17 12 15 2


Output


3


Input


10
1337 1337 1337 1337 1337 1337 1337 1337 1337 1337


Output


10


Input


6
1 1000 10000 10 100 1000000000


Output


1

Note

In the first example you can create a team with skills [12, 17, 15].

In the second example you can take all students in a team because their programming skills are equal.

In the third example you can create a team consisting of a single student (and you cannot create a team consisting of at least two students).

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int M = 1e9 + 7;
const int MOD = 1e9 + 7;
const double PI = 3.141592653589793238460;
long long power(long long a, long long b) {
  long long res = 1;
  if (a == 0) return 0;
  if (a == 1) return 1;
  for (; b > 0; b >>= 1) {
    if (b & 1) res = (res * a);
    if (res > MOD) res %= MOD;
    a = (a * a);
    if (a > MOD) a = a % MOD;
  }
  return res;
}
bool isPrime[1000000 + 1];
vector<long long> prime;
vector<int> divisor;
void seive2(int limit) {
  divisor = vector<int>(limit + 1, 0);
  for (int i = 2; i <= limit; i++) {
    if (divisor[i] == 0) {
      divisor[i] = i;
      if (i * 1ll * i <= limit)
        for (int j = i * i; j <= limit; j += i) divisor[j] = i;
    }
  }
}
void seive(int limit) {
  isPrime[0] = isPrime[1] = 1;
  for (int i = 2; i * i <= limit; i++) {
    if (!isPrime[i])
      for (int j = i * i; j <= limit; j += i) {
        isPrime[j] = 1;
      }
  }
  for (int i = 2; i <= limit; i++)
    if (!isPrime[i]) prime.push_back(i);
}
int pt[200100];
int sz[200100];
int finds(int x) {
  while (pt[x] != x) {
    pt[x] = pt[pt[x]];
    x = pt[x];
  }
  return x;
}
bool unions(int x, int y) {
  int xr = finds(x);
  int yr = finds(y);
  if (xr == yr) return 0;
  if (sz[xr] > sz[yr]) swap(xr, yr);
  sz[yr] += sz[xr];
  pt[xr] = yr;
  return 1;
}
vector<int> adj[200100];
void dfs(int x, int start, int p = -1) {
  if (x == start and p != -1) {
    return;
  }
  cout << x << ' ';
  for (int y : adj[x]) {
    if (y != p) {
      return dfs(y, start, x);
    }
  }
}
long long getSum(vector<int>& v1) {
  long long sum = 0;
  for (int i = 0; i < v1.size(); i++) sum += (long long)v1[i];
  return sum;
}
int n, k;
int arr[5001];
int dp[5001][5001];
int recur(int id, int tot = 0) {
  if (id >= n) {
    return 0;
  }
  if (dp[id][tot] != -1) return dp[id][tot];
  int ans = recur(id + 1, tot);
  if (tot < k) {
    int x = arr[id];
    int id2 = upper_bound(arr, arr + n, x + 5) - arr;
    ans = max(ans, (id2 - id) + recur(id2, tot + 1));
  }
  return dp[id][tot] = ans;
}
void solve() {
  cin >> n >> k;
  for (int i = 0; i < n; i++) cin >> arr[i];
  sort(arr, arr + n);
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= k; j++) dp[i][j] = -1;
  cout << recur(0, 0);
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0);
  int tt;
  tt = 1;
  while (tt--) {
    solve();
  }
}