#include <bits/stdc++.h>
using namespace std;
pair<long long, long long> Arb[2 * 100666 * 4];
long long Tree[2 * 100666 * 4], vst[2 * 100666], vdr[2 * 100666];
long long d[2 * 100666], h[2 * 100666];
int Is[2 * 100666], k;
void update(int st, int dr, int nod, int pos) {
  int mij = (st + dr) / 2;
  if (st == dr) {
    Arb[nod] = make_pair(vst[pos], vdr[pos]);
    return;
  }
  if (pos <= mij)
    update(st, mij, nod * 2, pos);
  else
    update(mij + 1, dr, nod * 2 + 1, pos);
  Arb[nod].first = min(Arb[nod * 2].first, Arb[nod * 2 + 1].first);
  Arb[nod].second = max(Arb[nod * 2].second, Arb[nod * 2 + 1].second);
}
void build_tree(int st, int dr, int nod) {
  int mij = (st + dr) / 2;
  if (st == dr) return;
  build_tree(st, mij, nod * 2);
  build_tree(mij + 1, dr, nod * 2 + 1);
  long long VD = Arb[nod * 2 + 1].second;
  long long VS = Arb[nod * 2].first;
  Tree[nod] = max(Tree[nod * 2], Tree[nod * 2 + 1]);
  Tree[nod] = max(Tree[nod], VD - VS);
}
void query_ints(int st, int dr, int nod, int X, int Y) {
  int mij = (st + dr) / 2;
  if (st >= X && dr <= Y) {
    Is[++k] = nod;
    return;
  }
  if (X <= mij) query_ints(st, mij, nod * 2, X, Y);
  if (Y > mij) query_ints(mij + 1, dr, nod * 2 + 1, X, Y);
}
int main() {
  int n, m, i;
  cin >> n >> m;
  for (i = 0; i < n; ++i) cin >> d[i];
  for (i = 0; i < n; ++i) cin >> h[i];
  for (i = n; i < n + n; ++i) {
    d[i] = d[i - n];
    h[i] = h[i - n];
  }
  long long sp = 0;
  for (i = 0; i < n + n; ++i) {
    vst[i] = sp - h[i] * 2;
    vdr[i] = sp + h[i] * 2;
    update(0, n + n - 1, 1, i);
    sp += d[i];
  }
  build_tree(0, n + n - 1, 1);
  for (i = 1; i <= m; ++i) {
    int xx, yy, x2, y2;
    cin >> xx >> yy;
    --xx, --yy;
    if (yy < xx) {
      x2 = yy + 1;
      y2 = xx - 1;
    } else {
      x2 = yy + 1;
      y2 = (xx - 1) + n;
    }
    xx = x2;
    yy = y2;
    k = 0;
    query_ints(0, n + n - 1, 1, xx, yy);
    long long result = 0;
    result = max(result, Tree[Is[1]]);
    long long Min_sp = Arb[Is[1]].first;
    for (int j = 2; j <= k; ++j) {
      result = max(result, Arb[Is[j]].second - Min_sp);
      Min_sp = min(Min_sp, Arb[Is[j]].first);
      result = max(result, Tree[Is[j]]);
    }
    cout << result << '\n';
  }
  return 0;
}
