/*
// 部分点解法
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;

const ll MAX_N = 2 * 1001;

ll X[MAX_N], Y[MAX_N], dp[MAX_N][MAX_N][2];

// dp[i][j][k]: 左からi番目まで, 右からj番目までの木を燃やした上でk = 0なら現在左からi番目の木の位置に, k = 1なら現在右からj番目の木の位置にいて, そのときの最大の移動距離

int main() {
    ll L, N;
    cin >> L >> N;
    X[0] = Y[0] = 0;
    for (int i = 1; i <= N; i++) {
        cin >> X[i];
    }
    sort(X, X + N);
    for (int i = N; i > 0; i--) {
        Y[N - i + 1] = L - X[i];
    }

    dp[0][0][0] = dp[0][0][1] = 0;

    for (int i = 0; i <= N; i++) {
        for (int j = 0; j <= N; j++) {
            for (int k = 0; k < 2; k++) {
                if (k == 0) {
                    dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + X[i + 1] - X[i]);
                    dp[i][j + 1][k + 1] = max(dp[i][j + 1][k + 1], dp[i][j][k] + X[i] + Y[j + 1]);
                }
                else {
                    dp[i + 1][j][k - 1] = max(dp[i + 1][j][k - 1], dp[i][j][k] + Y[j] + X[i + 1]);
                    dp[i][j + 1][k] = max(dp[i][j + 1][k], dp[i][j][k] + Y[j + 1] - Y[j]);
                }
            }
        }
    }

    ll ans = 0;
    for (int i = 0; i <= N; i++) {
        for (int j = 0; j < 2; j++) {
            ans = max(ans, dp[i][N - i][j]);
        }
    }
    cout << ans << endl;
    return 0;
}
*/

// 満点解法
/*
この問題は, 最初に左右どちらからスタートするかと
最後に左右どちらで終了するかで4通り探索し, その上で
左右に訪れる木の本数の決め方がN+1通りあるため
O(N)で解くことができる.
各パターンでの最大距離は
1. できるだけ多く切り返す
2. できるだけ遠くの位置で切り返す
という条件を満たすことで達成できる.
また, この考え方でも各パターンでのスタート位置を定めるごとに
そこから各木までの距離をいちいち計算しているとDPの時と
変わらない計算量になってしまうため, 満点を取るためには
上記の考え方プラス累積和によってあらかじめ距離を計算しておく工夫が
必要となる.
*/

#include<iostream>
using namespace std;
typedef long long ll;

const int MAX_N = 2 * 100001;

ll X[MAX_N], Y[MAX_N];

int main() {
    int L, N;
    cin >> L >> N;
    X[0] = Y[0] = 0;
    for (int i = 1; i <= N; i++) {
        cin >> X[i];
        Y[N - i + 1] = L - X[i];
    }
    for (int i = 1; i <= N; i++) {
        X[i] += X[i - 1];
        Y[i] += Y[i - 1];
    }
    ll ans = 0;
    for (int i = 0; i <= N; i++) {
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 2; k++) {
                /* debug start
                for (int l = N - i; l >= 1; l--) cout << X[l] << ' ';
                cout << "* ";
                for (int l = 1; l <= i; l++) cout << Y[l] << ' ';
                cout << endl;
                if (j == 0) cout << "右からスタート" << endl;
                else cout << "左からスタート" << endl;
                if (k == 0) cout << "右で終了" << endl;
                else cout << "左で終了" << endl;
                */
                int left = N - i, right = i;
                ll sub_ans = 0;
                if (j == k) {
                    if (j == 0) {
                        if (left > right) {
                            left = right + 1;
                        }
                        else {
                            right = left - 1;
                        }
                    }
                    else {
                        if (right > left) {
                            right = left + 1;
                        }
                        else {
                            left = right - 1;
                        }
                    }
                }
                else {
                    left = min(left, right);
                    right = left;
                }
                if (left < 0 || right < 0) continue;
                // cout << "左: " << left << "個, 右: " << right << "個" << endl;
                // cout << N - i - left << ' ' << i - right << endl;
                sub_ans += 2 * (X[N - i] - X[N - i - left]);
                sub_ans += 2 * (Y[i] - Y[i - right]);
                if (k == 0) sub_ans -= X[N - i] - X[N - i - 1];
                else sub_ans -= Y[i] - Y[i - 1];
                // cout << "sub_ans = " << sub_ans << endl;
                ans = max(ans, sub_ans);
                // cout << "---------------------" << endl;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

Measured memory_bytes: 3328