#include <bits/stdc++.h>
using namespace std;
const long long MX = 100001, INF = LONG_LONG_MIN / 3;
pair<long long, long long> tree[3][MX * 4], JD;
long long n, QN, H[MX], D[MX], st, en;
void build(long long dim, long long x, long long a, long long b) {
  if (a == b) {
    if (dim == 0) tree[dim][x] = make_pair(2 * H[a] + D[a], x);
    if (dim == 1) tree[dim][x] = make_pair(2 * H[a] - D[a], x);
    if (dim == 2) tree[dim][x] = make_pair(2 * H[a] + D[n] - D[a], x);
    return;
  }
  build(dim, x * 2, a, (a + b) / 2);
  build(dim, x * 2 + 1, (a + b) / 2 + 1, b);
  tree[dim][x] = max(tree[dim][x * 2], tree[dim][x * 2 + 1]);
}
void update(long long dim, long long x, pair<long long, long long> V) {
  tree[dim][x] = V;
  x /= 2;
  while (x > 0) {
    tree[dim][x] = max(tree[dim][x * 2], tree[dim][x * 2 + 1]);
    x /= 2;
  }
}
pair<long long, long long> query(long long dim, long long x, long long a,
                                 long long b) {
  if (st > b || en < a) return JD;
  if (a >= st && b <= en) return tree[dim][x];
  return max(query(dim, x * 2, a, (a + b) / 2),
             query(dim, x * 2 + 1, (a + b) / 2 + 1, b));
}
long long solve(long long L, long long R) {
  if (L > R) return INF;
  st = L, en = R;
  long long ret = 0;
  pair<long long, long long> tmp, q1, q2;
  q1 = query(0, 1, 1, n);
  tmp = tree[1][q1.second];
  update(1, q1.second, JD);
  q2 = query(1, 1, 1, n);
  ret = q1.first + q2.first;
  update(1, q1.second, tmp);
  q1 = query(1, 1, 1, n);
  tmp = tree[0][q1.second];
  update(0, q1.second, JD);
  q2 = query(0, 1, 1, n);
  ret = max(ret, q1.first + q2.first);
  update(0, q1.second, tmp);
  return ret;
}
int main() {
  JD = make_pair(INF, INF);
  scanf("%I64d %I64d", &n, &QN);
  for (long long j = 2; j <= n; j++) scanf("%I64d", &D[j]);
  scanf("%I64d", &D[1]);
  for (long long j = 1; j <= n; j++) D[j] += D[j - 1];
  for (long long j = 1; j <= n; j++) scanf("%I64d", &H[j]);
  for (long long dim = 0; dim < 3; dim++) build(dim, 1, 1, n);
  while (QN--) {
    long long A, B, ans = 0, cur = 0, best = 0;
    scanf("%I64d %I64d", &A, &B);
    if (A <= B) {
      st = 1, en = A - 1;
      best = max(best, solve(st, en));
      cur = query(0, 1, 1, n).first;
      st = B + 1, en = n;
      best = max(best, solve(st, en));
      cur += query(2, 1, 1, n).first;
      ans = max(best, cur);
    } else {
      st = B + 1, en = A - 1;
      ans = solve(st, en);
    }
    cout << ans << endl;
  }
}
