#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, inf = 0x3f3f3f3f;
int n, m;
long long d[N << 1], h[N << 1];
struct node {
  long long mx, mn, res;
  node operator+(const node x) const {
    node z;
    z.mx = max(mx, x.mx);
    z.mn = min(mn, x.mn);
    z.res = max(x.mx - mn, max(res, x.res));
    return z;
  }
};
struct segmenttree {
  node t[N << 3];
  void pushup(int rt) { t[rt] = t[(rt << 1)] + t[(rt << 1 | 1)]; }
  void build(int rt, int l, int r) {
    t[rt].mx = -inf;
    t[rt].mn = inf;
    t[rt].res = -inf;
    if (l == r) {
      t[rt].mx = h[l] + d[l - 1];
      t[rt].mn = d[l - 1] - h[l];
      return;
    }
    int mid = l + r >> 1;
    build(rt << 1, l, mid);
    build(rt << 1 | 1, mid + 1, r);
    pushup(rt);
    return;
  }
  node query(int rt, int l, int r, int L, int R) {
    if (L <= l && r <= R) return t[rt];
    int mid = l + r >> 1;
    node ret;
    if (R <= mid)
      ret = query(rt << 1, l, mid, L, R);
    else if (L > mid)
      ret = query(rt << 1 | 1, mid + 1, r, L, R);
    else
      ret = query(rt << 1, l, mid, L, R) + query(rt << 1 | 1, mid + 1, r, L, R);
    return ret;
  }
} tr;
int main() {
  scanf("%d%d", &n, &m);
  d[0] = 0;
  for (int i = 1; i <= n; i++) scanf("%lld", &d[i]), d[n + i] = d[i];
  for (int i = 1; i <= n; i++) scanf("%lld", &h[i]), h[i] *= 2, h[n + i] = h[i];
  for (int i = 1; i <= 2 * n; i++) d[i] += d[i - 1];
  tr.build(1, 1, 2 * n);
  while (m--) {
    int a, b;
    scanf("%d%d", &a, &b);
    if (a <= b)
      printf("%lld\n", tr.query(1, 1, 2 * n, b + 1, a + n - 1).res);
    else
      printf("%lld\n", tr.query(1, 1, 2 * n, b + 1, a - 1).res);
  }
  return 0;
}
