#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 2, K = 22;
int d[N], h[N];
struct tt {
  long long suf, pref, best, sumD;
  tt() : suf(0), pref(0), best(0), sumD(0) {}
} a[N][K + 1];
tt calc(tt left, tt right, int m) {
  tt res;
  res.sumD = left.sumD + right.sumD + d[m];
  res.pref = max(left.pref, left.sumD + right.pref + d[m]);
  res.suf = max(left.suf + right.sumD + d[m], right.suf);
  res.best = max(left.best, right.best);
  res.best = max(res.best, left.suf + right.pref + d[m]);
  return res;
}
long long getAns(int l, int r) {
  int len = r - l + 1, j = log2(len);
  len = 1 << j;
  tt res = a[l][j];
  l += len;
  while (l <= r) {
    len = r - l + 1;
    j = log2(len);
    len = 1 << j;
    res = calc(res, a[l][j], l - 1);
    l += len;
  }
  return res.best;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &d[i]);
    d[i + n] = d[i];
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", &h[i]);
    h[i + n] = h[i];
  }
  for (int i = 0; i < n * 2; i++) {
    tt cur;
    cur.pref = cur.suf = cur.best = 2 * h[i];
    a[i][0] = cur;
  }
  for (int j = 1; 1 << j <= n * 2; j++) {
    int len = 1 << j;
    for (int i = 0; i + len - 1 < n * 2; i++) {
      a[i][j] = calc(a[i][j - 1], a[i + len / 2][j - 1], i + len / 2 - 1);
    }
  }
  while (m--) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    if (x > y) {
      printf("%lld\n", getAns(y + 1, x - 1));
    } else {
      printf("%lld\n", getAns(y + 1, x + n - 1));
    }
  }
  return 0;
}
