#include <bits/stdc++.h>
using namespace std;
struct debugger {
  template <typename T>
  debugger& operator,(const T v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
const double pi = acos(-1.0);
const double eps = 1e-7;
template <class TT>
TT sqr(TT a) {
  return a * a;
}
template <class TT>
TT abs(TT a) {
  if (a < 0) return -a;
  return a;
}
template <class ZZ>
ZZ max(ZZ a, ZZ b, ZZ c) {
  return max(a, max(b, c));
}
template <class ZZ>
ZZ min(ZZ a, ZZ b, ZZ c) {
  return min(a, min(b, c));
}
const int S = 200010;
long long d[S], h[S];
long long lft[S];
long long rit[S];
int tl[3 * S];
int tr[3 * S];
int nn;
int lbuild(int n, int l, int r) {
  if (l == r) return tl[n] = l;
  int m = (l + r) >> 1;
  int a = lbuild(n << 1, l, m);
  int b = lbuild((n << 1) + 1, m + 1, r);
  if (lft[b] + 2 * h[b] >= lft[a] + 2 * h[a]) return tl[n] = b;
  return tl[n] = a;
}
int lque(int n, int l, int r, int ml, int mr) {
  if (l > mr || r < ml) return 0;
  if (ml <= l && r <= mr) return tl[n];
  int m = (l + r) >> 1;
  int a = lque(n << 1, l, m, ml, mr);
  int b = lque((n << 1) + 1, m + 1, r, ml, mr);
  if (!a) return b;
  if (!b) return a;
  if (lft[b] + 2 * h[b] >= lft[a] + 2 * h[a]) return b;
  return a;
}
int rbuild(int n, int l, int r) {
  if (l == r) return tr[n] = l;
  int m = (l + r) >> 1;
  int a = rbuild(n << 1, l, m);
  int b = rbuild((n << 1) + 1, m + 1, r);
  if (rit[b] + 2 * h[b] > rit[a] + 2 * h[a]) return tr[n] = b;
  return tr[n] = a;
}
int rque(int n, int l, int r, int ml, int mr) {
  if (l > mr || r < ml) return 0;
  if (ml <= l && r <= mr) return tr[n];
  int m = (l + r) >> 1;
  int a = rque(n << 1, l, m, ml, mr);
  int b = rque((n << 1) + 1, m + 1, r, ml, mr);
  if (!a) return b;
  if (!b) return a;
  if (rit[b] + 2 * h[b] > rit[a] + 2 * h[a]) return b;
  return a;
}
long long get(int x, int y) {
  int a, b;
  long long mx = 0, cur;
  a = rque(1, 1, nn, x, y - 1);
  b = y;
  cur = 2 * (h[a] + h[b]) + lft[b] - lft[a];
  mx = max(cur, mx);
  a = x;
  b = lque(1, 1, nn, x + 1, y);
  cur = 2 * (h[a] + h[b]) + lft[b] - lft[a];
  mx = max(cur, mx);
  a = rque(1, 1, nn, x, y - 1);
  b = lque(1, 1, nn, a + 1, y);
  cur = 2 * (h[a] + h[b]) + lft[b] - lft[a];
  mx = max(cur, mx);
  b = lque(1, 1, nn, x + 1, y);
  a = rque(1, 1, nn, x, b - 1);
  cur = 2 * (h[a] + h[b]) + lft[b] - lft[a];
  mx = max(cur, mx);
  return mx;
}
int main() {
  int i, j, k, l, tks, ks = 1, n, m, u, v, x, y;
  long long mx;
  while (scanf("%d%d", &n, &m) == 2) {
    for (i = 1; i <= n; i++) {
      scanf("%I64d", &d[i]);
      d[i + n] = d[i];
    }
    for (i = 1; i <= n; i++) {
      scanf("%I64d", &h[i]);
      h[i + n] = h[i];
    }
    nn = 2 * n;
    d[0] = lft[0] = rit[nn + 1] = 0;
    for (i = 1; i <= nn; i++) lft[i] = lft[i - 1] + d[i - 1];
    for (i = nn; i > 0; i--) rit[i] = rit[i + 1] + d[i];
    lbuild(1, 1, nn);
    rbuild(1, 1, nn);
    while (m--) {
      scanf("%d%d", &u, &v);
      if (u <= v) {
        x = v + 1;
        y = u + n - 1;
      } else {
        x = v + 1;
        y = u - 1;
      }
      assert(x <= y);
      mx = get(x, y);
      printf("%I64d\n", mx);
    }
  }
  return 0;
}
