#include <bits/stdc++.h>
using namespace std;
int h[200000], d[200000];
long long ds[200000 + 1];
struct node {
  long long vp, vn, vt;
};
node seg[4 * 200000];
const node empty = {-(1LL << 60), -(1LL << 60), -(1LL << 60)};
node merge(const node &a, const node &b) {
  return {
      max(a.vp, b.vp),
      max(a.vn, b.vn),
      max(max(a.vt, b.vt), max(a.vp + b.vn, a.vn + b.vp)),
  };
}
node get_val(int i) {
  return {2LL * h[i] + ds[i], 2LL * h[i] - ds[i], -(1LL << 60)};
}
struct SegmentTree {
  int n;
  SegmentTree(int n) : n(n) {}
  void build() { build(0, 0, n); }
  void build(int i, int l, int r) {
    if (l + 1 == r) {
      seg[i] = get_val(l);
      return;
    }
    int m = (l + r) / 2;
    build(2 * i + 1, l, m);
    build(2 * i + 2, m, r);
    seg[i] = merge(seg[2 * i + 1], seg[2 * i + 2]);
  }
  node query(int lb, int rb) { return query(lb, rb, 0, 0, n); }
  node query(int lb, int rb, int i, int l, int r) {
    if (l >= rb || r <= lb) return empty;
    if (l >= lb && r <= rb) return seg[i];
    int m = (l + r) / 2;
    return merge(query(lb, rb, 2 * i + 1, l, m),
                 query(lb, rb, 2 * i + 2, m, r));
  }
};
int main() {
  int n, q;
  scanf("%d%d", &n, &q);
  ds[0] = 0;
  for (int i = 0; i < n; i++) {
    scanf("%d", &d[i]);
    ds[i + 1] = ds[i] + d[i];
  }
  for (int i = n; i < 2 * n; i++) ds[i + 1] = ds[i] + d[i - n];
  for (int i = 0; i < n; i++) {
    scanf("%d", &h[i]);
    h[i + n] = h[i];
  }
  SegmentTree st(2 * n);
  st.build();
  while (q--) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    long long ans = 0;
    if (a < b)
      ans = st.query(b, a + n).vt;
    else
      ans = st.query(b + n, a + n).vt;
    printf("%lld\n", ans);
  }
}
