#include <bits/stdc++.h>
using namespace std;
long long h[100005];
long long d[100005];
struct S {
  long long val;
  int l, r;
  int a, b;
  S() {
    val = 0;
    r = -1000000000;
    l = 1000000000;
    a = l;
    b = r;
  }
};
class SegTree {
 public:
  vector<S> tree;
  SegTree(int n) { tree = vector<S>(4 * n); }
  SegTree() {}
  S join(S L, S R) {
    S res;
    if (L.a > L.b) return R;
    if (R.a > R.b) return L;
    res.val = max(L.val, R.val);
    res.val = max(res.val, d[R.r - 1] - d[L.l - 1] + 2 * (h[L.l] + h[R.r]));
    if (2 * h[R.l] + d[R.b - 1] - d[R.l - 1] >
        2 * h[L.l] + d[R.b - 1] - d[L.l - 1])
      res.l = R.l;
    else
      res.l = L.l;
    if (2 * h[L.r] + d[L.r - 1] - d[L.a - 1] >
        2 * h[R.r] + d[R.r - 1] - d[L.a - 1])
      res.r = L.r;
    else
      res.r = R.r;
    res.a = L.a;
    res.b = R.b;
    return res;
  }
  S set(int i, int l, int r, int x, S val) {
    if (l > r) {
      tree[i] = S();
      return tree[i];
    }
    if (x > r || x < l) {
      return tree[i];
    }
    if (l == r) {
      tree[i] = val;
      return tree[i];
    }
    S L = set(i * 2 + 1, l, (l + r) / 2, x, val);
    S R = set(i * 2 + 2, (l + r) / 2 + 1, r, x, val);
    tree[i] = join(L, R);
    return tree[i];
  }
  S get(int i, int l, int r, int a, int b) {
    if (l >= a && r <= b) {
      return tree[i];
    }
    if (l > b || r < a) {
      S ret;
      return ret;
    }
    S L = get(i * 2 + 1, l, (l + r) / 2, a, b);
    S R = get(i * 2 + 2, (l + r) / 2 + 1, r, a, b);
    S ret = join(L, R);
    return ret;
  }
};
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  d[0] = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", d + i);
    d[i] += d[i - 1];
  }
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", h + i);
  }
  SegTree seg(n);
  for (int i = 1; i <= n; i++) {
    S val;
    val.val = 0;
    val.a = val.b = val.l = val.r = i;
    seg.set(0, 1, n, i, val);
  }
  while (m--) {
    int a, b;
    scanf("%d %d", &a, &b);
    if (a <= b) {
      S left = seg.get(0, 1, n, b + 1, n);
      S right = seg.get(0, 1, n, 1, a - 1);
      long long res = max(left.val, right.val);
      if (left.a <= left.b && right.a <= right.b) {
        res = max(res, d[right.r - 1] + d[n] - d[left.l - 1] +
                           2 * (h[left.l] + h[right.r]));
      }
      printf("%I64d\n", res);
    } else {
      S res = seg.get(0, 1, n, b + 1, a - 1);
      printf("%I64d\n", res.val);
    }
  }
}
