Primal Sport

Alice and Bob begin their day with a quick game. They first choose a starting number X 0 ≥ 3 and try to reach one million by the process described below.

Alice goes first and then they take alternating turns. In the i-th turn, the player whose turn it is selects a prime number smaller than the current number, and announces the smallest multiple of this prime number that is not smaller than the current number.

Formally, he or she selects a prime p < X i - 1 and then finds the minimum X i ≥ X i - 1 such that p divides X i. Note that if the selected prime p already divides X i - 1, then the number does not change.

Eve has witnessed the state of the game after two turns. Given X 2, help her determine what is the smallest possible starting number X 0. Note that the players don’t necessarily play optimally. You should consider all possible game evolutions.

Input

The input contains a single integer X 2 (4 ≤ X 2 ≤ 106). It is guaranteed that the integer X 2 is composite, that is, is not prime.

Output

Output a single integer — the minimum possible X 0.

Examples

input

14

output

6

input

20

output

15

input

8192

output

8191

Note

In the first test, the smallest possible starting number is X 0 = 6. One possible course of the game is as follows:

  • Alice picks prime 5 and announces X 1 = 10
  • Bob picks prime 7 and announces X 2 = 14.

In the second case, let X 0 = 15.

  • Alice picks prime 2 and announces X 1 = 16
  • Bob picks prime 5 and announces X 2 = 20.

Solution:

#include <bits/stdc++.h>

using namespace std;

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int x;
cin >> x;
vector<int> p(x + 1);
for (int i = 1; i <= x; i++) {
    p[i] = i;
  }
  for (int i = 2; i <= x; i++) {
    if (p[i] == i) {
      for (int j = i + i; j <= x; j += i) {
        p[j] = min(p[j], i);
      }
    }
  }
  const int inf = (int) 1e9;
  vector<int> best(x + 1, inf);
for (int i = 1; i <= x; i++) {
    int tmp = i;
    while (tmp > 1) {
int d = p[tmp];
if (i != d) {
best[i] = min(best[i], i - d + 1);
}
tmp /= p[tmp];
}
}
int res = inf;
{
int tmp = x;
while (tmp > 1) {
int d = p[tmp];
for (int j = x - d + 1; j <= x; j++) {
        res = min(res, best[j]);
      }
      tmp /= p[tmp];
    }
  }
  cout << res << '\n';
  return 0;
}