#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
long long d[1000001];
long long h[1000001];
long long sl[1000001];
long long sr[1000001];
long long n;
struct st {
  long long dl;
  long long dr;
  long long ans;
};
st ST[800011];
void build(long long id, long long a, long long b) {
  if (a == b) {
    ST[id].dl = sl[a];
    ST[id].dr = sr[a];
    ST[id].ans = -inf;
    return;
  }
  long long mid = (a + b) / 2;
  build(2 * id, a, mid);
  build(2 * id + 1, mid + 1, b);
  ST[id].ans = max(ST[2 * id].ans, ST[2 * id + 1].ans);
  ST[id].ans = max(ST[id].ans, ST[2 * id].dr + ST[2 * id + 1].dl);
  ST[id].dl = max(ST[2 * id].dl, ST[2 * id + 1].dl);
  ST[id].dr = max(ST[2 * id].dr, ST[2 * id + 1].dr);
}
st query(long long id, long long a, long long b, long long l, long long r) {
  if (a >= l && b <= r) return ST[id];
  if (a > b || b < l || a > r) return st{-inf, -inf, -inf};
  long long mid = (a + b) / 2;
  st temp1 = query(2 * id, a, mid, l, r);
  st temp2 = query(2 * id + 1, mid + 1, b, l, r);
  st temp;
  temp.ans = max(temp1.ans, temp2.ans);
  temp.ans = max(temp.ans, temp1.dr + temp2.dl);
  temp.dl = max(temp1.dl, temp2.dl);
  temp.dr = max(temp1.dr, temp2.dr);
  return temp;
}
signed main() {
  long long q;
  cin >> n >> q;
  for (long long i = 1; i <= n; i++) {
    cin >> d[i];
    d[i + n] = d[i];
  }
  for (long long i = 1; i <= n; i++) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  for (long long i = 1; i <= 2 * n; i++) {
    sl[i] = sl[i - 1] + d[i - 1];
    sr[i] = sr[i - 1] - d[i - 1];
  }
  for (long long i = 1; i <= 2 * n; i++) {
    sl[i] += 2 * h[i];
    sr[i] += 2 * h[i];
  }
  build(1, 1, 2 * n);
  while (q--) {
    long long l, r;
    cin >> l >> r;
    if (l <= r)
      cout << query(1, 1, 2 * n, r + 1, n + l - 1).ans << endl;
    else
      cout << query(1, 1, 2 * n, r + 1, l - 1).ans << endl;
  }
}
