#include <bits/stdc++.h>
using namespace std;
string YN(bool y) { return (y ? "YES" : "NO"); }
string yn(bool y) { return (y ? "Yes" : "No"); }
string ON(bool y) { return (y ? "OK" : "NG"); }
vector<long long> dat(2 * 131072 - 1, -1e18);
void init() {
  for (int i = 0; i < 2 * 131072 - 1; i++) dat[i] = -1e18;
}
void update(int n, int k, long long a) {
  k += n - 1;
  dat[k] = a;
  while (k > 0) {
    k = (k - 1) / 2;
    dat[k] = max(dat[k * 2 + 1], dat[k * 2 + 2]);
  }
}
long long query(int a, int b, int k, int l, int r) {
  if (r <= a || b <= l) return -1e18;
  if (a <= l && r <= b) {
    return dat[k];
  } else {
    long long vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
    long long vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
    return max(vl, vr);
  }
}
int main(void) {
  long long n, c, ans = 0;
  cin >> n >> c;
  vector<long long> x(n), v(n), vsum(n + 1, 0), vinv(n + 1, 0);
  for (int i = (int)(0); i < (int)(n); i++) cin >> x[i] >> v[i];
  for (int i = (int)(0); i < (int)(n); i++) vsum[i + 1] = vsum[i] + v[i];
  for (int i = (int)(1); i < (int)(n + 1); i++) vsum[i] -= x[i - 1];
  for (int i = (int)(n)-1; i >= (int)(0); i--) vinv[i] = vinv[i + 1] + v[i];
  for (int i = (int)(0); i < (int)(n); i++) vinv[i] -= (c - x[i]);
  for (int i = (int)(0); i < (int)(n + 1); i++) {
    if (ans < vsum[i]) ans = vsum[i];
    if (ans < vinv[i]) ans = vinv[i];
  }
  if (n <= 100) {
    for (int i = (int)(0); i < (int)(n); i++) {
      for (int j = (int)(0); j < (int)(n); j++) {
        if (i < j) {
          long long temp = vsum[i + 1] + vinv[j] - x[i];
          if (ans < temp) ans = temp;
          temp = vsum[i + 1] + vinv[j] - (c - x[j]);
          if (ans < temp) ans = temp;
        }
      }
    }
    cout << ans << endl;
  } else {
    for (int i = (int)(0); i < (int)(n + 1); i++) update(n + 1, i, vsum[i]);
    for (int i = (int)(0); i < (int)(n); i++) {
      long long temp = vinv[i] + query(0, i + 1, 0, 0, n + 1) - (c - x[i]);
      if (ans < temp) ans = temp;
    }
    init();
    for (int i = (int)(0); i < (int)(n + 1); i++) update(n + 1, i, vinv[i]);
    for (int i = (int)(1); i < (int)(n + 1); i++) {
      long long temp = vsum[i] + query(i, n + 1, 0, 0, n + 1) - x[i - 1];
      if (ans < temp) ans = temp;
    }
    cout << ans << endl;
  }
}
