#include <bits/stdc++.h>
using namespace std;
struct kxj {
  long long Lmx, Rmx, sum, mx;
  int d;
} tree[200005 << 2];
int d[200005], h[200005];
kxj Up(kxj A, kxj B) {
  kxj C;
  C.sum = A.sum + B.sum + A.d;
  C.Lmx = max(A.Lmx, B.Lmx + A.sum + A.d);
  C.Rmx = max(A.Rmx + B.sum + A.d, B.Rmx);
  C.mx = max(A.Rmx + B.Lmx + A.d, max(A.mx, B.mx));
  C.d = B.d;
  return C;
}
void build(int L, int R, int p) {
  if (L == R) {
    tree[p] = (kxj){h[L], h[L], 0, h[L], d[L]};
    return;
  }
  int mid = L + R >> 1;
  build(L, mid, p << 1);
  build(mid + 1, R, p << 1 | 1);
  tree[p] = Up(tree[p << 1], tree[p << 1 | 1]);
}
kxj query(int L, int R, int l, int r, int p) {
  if (L == l && R == r) return tree[p];
  int mid = L + R >> 1;
  if (r <= mid)
    return query(L, mid, l, r, p << 1);
  else if (l > mid)
    return query(mid + 1, R, l, r, p << 1 | 1);
  else
    return Up(query(L, mid, l, mid, p << 1),
              query(mid + 1, R, mid + 1, r, p << 1 | 1));
}
int main() {
  int n, m, i, j, a, b;
  scanf("%d %d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%d", &d[i]);
  for (i = 1; i <= n; i++) scanf("%d", &h[i]), h[i] *= 2;
  for (i = n + 1; i <= n + n; i++) d[i] = d[i - n], h[i] = h[i - n];
  build(1, n * 2, 1);
  for (i = 1; i <= m; i++) {
    scanf("%d %d", &a, &b);
    if (a <= b)
      a += n - 1, b++;
    else
      a--, b++;
    swap(a, b);
    if (a > b)
      puts("0");
    else
      cout << query(1, n * 2, a, b, 1).mx << endl;
  }
  return 0;
}
