Problem: Owl Sonya decided to become a partymaker. To train for this role she gather all her owl friends in the country house. There are m chairs located in a circle and consequently numbered with integers from 1 to m. Thus, chairs i and i + 1 are neighbouring for all i from 1 to m - 1. Chairs 1 and m are also neighbouring. Some chairs are occupied by her friends. There are n friends in total. No two friends occupy the same chair. Rules are the following:

  1. Each participant removes from the game the chair he is currently sitting on. 
  2. Each of the participants choose a direction that she will follow: clockwise (indices increase, from m goes to 1) and counter-clockwise (indices decrease, from 1 goes to m). This direction may coincide or be different for any pair of owls. 
  3. Each turn all guests move one step in the chosen directions. If some guest move to the position with a chair there, he removes this chair from the game. 
  4. Game ends if there are no more chairs left in the game. 



Owls are very busy and want to get rid of the game as soon as possible. They cooperate to pick the direction. Your goal is to find the minimum number o moves required to finish the game.

Input

The first line of the input contains a single integer m (1 ≤ m ≤ 109) — the length of the circle.

The second line contains a single integer n (1 ≤ n ≤ 100 000) — the number of friends.

Last line contains an increasing sequence of n integers ai (1 ≤ ai ≤ m) — initial positions of all owls.

Output

Print the minimum number of move required to finish the game. Note, that 0 also may be an answer.

Examples

Input

6
3
1 3 5


Output

1


Input

6
2
1 6


Output

2


Input

406
6
1 2 3 204 205 206


Output

100

Note

In the first sample, it's possible if all owls will move clockwise, i.e. in the direction of increasing indices.

In the sample, first owl has to move clockwise, while the second — counterclockwise.

In the third sample, the first and the fourth owls should move counterclockwise, while the third and the sixth — clockwise. The second and the firth may move in any direction.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <class T>
void splitstr(const string &s, vector<T> &out) {
  istringstream in(s);
  out.clear();
  copy(istream_iterator<T>(in), istream_iterator<T>(), back_inserter(out));
}
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
static void redirect(int argc, const char **argv) {
  ios::sync_with_stdio(false);
  if (argc > 1) {
    static filebuf f;
    f.open(argv[1], ios::in);
    cin.rdbuf(&f);
    if (!cin) {
      cerr << "Failed to open '" << argv[1] << "'" << endl;
      exit(1);
    }
  }
  if (argc > 2) {
    static filebuf f;
    f.open(argv[2], ios::out | ios::trunc);
    cout.rdbuf(&f);
    if (!cout) {
      cerr << "Failed to open '" << argv[2] << "'" << endl;
    }
  }
}
static int prev(int p, int N) {
  if (p-- == 0) p += N;
  return p;
}
static long long dist(long long a, long long b, long long R) {
  if (b >= a)
    return b - a;
  else
    return b - a + R;
}
int main(int argc, const char **argv) {
  redirect(argc, argv);
  long long R;
  int N;
  cin >> R >> N;
  vector<long long> a(N);
  for (int i = 0; i < N; i++) {
    cin >> a[i];
    a[i]--;
  }
  a.resize(unique(begin(a), end(a)) - a.begin());
  N = a.size();
  if (N == R) {
    cout << "0\n";
    return 0;
  } else if (N == 1) {
    cout << R - 1 << '\n';
    return 0;
  }
  long long lo = 0;
  long long hi = R;
  while (hi - lo > 1) {
    long long mid = (lo + hi) / 2;
    int gap = -1;
    for (int i = 0; i < N; i++)
      if (dist(a[prev(i, N)], a[i], R) > mid) {
        gap = i;
        break;
      }
    if (gap == -1) {
      hi = mid;
      continue;
    }
    vector<long long> b(N);
    for (int i = 0; i < N - gap; i++) b[i] = a[i + gap] - a[gap];
    for (int i = N - gap; i < N; i++) b[i] = a[i + gap - N] - a[gap] + R;
    bool good = false;
    for (int pass = 0; pass < 2; pass++) {
      long long wrap;
      vector<long long> dp(N, -1);
      int p;
      if (pass == 0) {
        wrap = R - mid + 1;
        dp[0] = 1;
        p = 1;
      } else {
        if (b[1] >= mid) continue;
        wrap = R + b[1] - mid + 1;
        dp[0] = INT_MIN;
        dp[1] = mid;
        p = 2;
      }
      for (; p < N; p++) {
        if (dp[p - 1] >= b[p])
          dp[p] = b[p] + mid;
        else if (p >= 2 && dp[p - 2] > b[p] - mid)
          dp[p] = max(b[p] + 1, b[p - 1] + mid);
        else if (dp[p - 1] > b[p] - mid)
          dp[p] = b[p] + 1;
        else
          break;
      }
      if (p == N && dp[N - 1] >= wrap) good = true;
    }
    if (good)
      hi = mid;
    else
      lo = mid;
  }
  cout << hi - 1 << '\n';
  return 0;
}