#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const long long inf = 1e17;
struct node {
  long long res, mx_r, mx_l;
};
int n;
long long a[N];
long long p[N];
long long h[N];
struct ST {
  node t[2 * N];
  node combine(node a, node b) {
    node res = {max({a.res, b.res, b.mx_r + a.mx_l}), max(a.mx_r, b.mx_r),
                max(a.mx_l, b.mx_l)};
    return res;
  }
  void build() {
    for (int i = 0; i < n; i++)
      t[i + n] = {-inf, p[i] + 2 * h[i], -p[i] + 2 * h[i]};
    for (int i = n - 1; i > 0; i--) t[i] = combine(t[i << 1], t[i << 1 | 1]);
  }
  long long query(int l, int r) {
    vector<node> lef, rit;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) lef.push_back(t[l++]);
      if (r & 1) rit.push_back(t[--r]);
    }
    node res = {-inf, -inf, -inf};
    for (auto v : lef) res = combine(res, v);
    reverse(rit.begin(), rit.end());
    for (auto v : rit) res = combine(res, v);
    return res.res;
  }
} st;
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  ::n = n + n;
  for (int i = 0; i < n; i++) scanf("%I64d", a + i);
  for (int i = 0; i < n; i++) scanf("%I64d", h + i), h[i + n] = h[i];
  for (int i = 1; i < ::n; i++) p[i] = p[i - 1] + a[(i - 1) % n];
  st.build();
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--, b--;
    if (a > b)
      tie(a, b) = make_tuple(b + 1, a - 1);
    else
      tie(a, b) = make_tuple(b + 1, a + n - 1);
    long long res = st.query(a, b + 1);
    printf("%I64d\n", res);
  }
  return 0;
}
