#include <bits/stdc++.h>
using namespace std;
struct Node {
  long long D = -1e9, D2 = -1e9, seg = -1e9, pref = -1e9, suff = -1e9;
};
const long long maxn = 1e5 + 5;
long long d[maxn], h[maxn], n;
Node seg[4 * maxn];
void build(long long id, long long L, long long R) {
  if (R == L + 1) {
    seg[id].D = d[L];
    seg[id].D2 = d[(L - 1 + n) % n] + seg[id].D;
    seg[id].pref = seg[id].suff = 2 * h[L];
    seg[id].suff += d[L];
    return;
  }
  long long mid = (L + R) / 2;
  build(2 * id + 0, L, mid);
  build(2 * id + 1, mid, R);
  seg[id].D = seg[2 * id].D + seg[2 * id + 1].D;
  seg[id].D2 = seg[2 * id].D2 + seg[2 * id + 1].D;
  seg[id].pref = max(seg[2 * id].pref, seg[2 * id + 1].pref + seg[2 * id].D);
  seg[id].suff =
      max(seg[2 * id + 1].suff, seg[2 * id].suff + seg[2 * id + 1].D);
  seg[id].seg = max(max(seg[2 * id].seg, seg[2 * id + 1].seg),
                    seg[2 * id].suff + seg[2 * id + 1].pref);
}
Node get(long long id, long long L, long long R, long long l, long long r) {
  Node ans;
  if (R <= l || r <= L || r <= l) return ans;
  if (L >= l && R <= r) return seg[id];
  long long mid = (L + R) / 2;
  Node P = get(2 * id, L, mid, l, r), Q = get(2 * id + 1, mid, R, l, r);
  ans.D = P.D + Q.D;
  ans.D2 = P.D2 + Q.D;
  ans.pref = max(P.pref, Q.pref + P.D);
  ans.suff = max(Q.suff, P.suff + Q.D);
  ans.seg = max(max(P.seg, Q.seg), P.suff + Q.pref);
  return ans;
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long m;
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    cin >> d[i];
  }
  for (long long i = 0; i < n; i++) {
    cin >> h[i];
  }
  build(1, 0, n);
  for (long long i = 0; i < m; i++) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    if (a <= b) {
      Node P = get(1, 0, n, 0, a);
      Node Q = get(1, 0, n, b + 1, n);
      cout << max(max(P.seg, Q.seg), Q.suff + P.pref) << '\n';
    } else {
      cout << get(1, 0, n, b + 1, a).seg << '\n';
    }
  }
}
