#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using ll = long long;
const ll INF = LONG_LONG_MAX / 2;
template <class T>
struct Data {
  T sum, pref, suff, ans;
  Data(T h = -INF, T d = 0) {
    ans = -INF;
    pref = h;
    suff = h + d;
    sum = d;
  }
};
template <class T>
struct Combine {
  Data<T> operator()(Data<T> l, Data<T> r) {
    Data<T> res;
    res.sum = l.sum + r.sum;
    res.suff = max(l.suff + r.sum, r.suff);
    res.pref = max(r.pref + l.sum, l.pref);
    res.ans = max(max(l.ans, r.ans), l.suff + r.pref);
    return res;
  }
};
template <class T, class OP>
struct SegmentTree {
  int n;
  vector<T> t;
  OP op;
  SegmentTree(int n) : n(n), t(n << 1) {}
  template <class U>
  void Set(int i, U h, U d) {
    t[i + n] = T(h, d);
  }
  void Build() {
    for (int i = n - 1; i > 0; --i) t[i] = op(t[i << 1], t[i << 1 | 1]);
  }
  void Update(int p, T value) {
    for (t[p += n] = value; p >>= 1;) t[p] = op(t[p << 1], t[p << 1 | 1]);
  }
  T Query(int l, int r) {
    T resl, resr;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1) resl = op(resl, t[l++]);
      if (r & 1) resr = op(t[--r], resr);
    }
    return op(resl, resr);
  }
};
int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, q;
  cin >> n >> q;
  SegmentTree<Data<ll>, Combine<ll>> seg(2 * n);
  vector<ll> d(n), h(n);
  for (int i = 0; i < n; i++) cin >> d[i];
  for (int i = 0; i < n; i++) cin >> h[i];
  for (int i = 0; i < n; i++) {
    seg.Set(i, 2 * h[i], d[i]);
    seg.Set(i + n, 2 * h[i], d[i]);
  }
  seg.Build();
  for (int i = 0; i < q; i++) {
    int xl, xr;
    cin >> xl >> xr;
    xl--;
    xr--;
    if (xl <= xr) {
      cout << seg.Query(xr + 1, xl + n).ans << '\n';
    } else {
      cout << seg.Query(xr + 1, xl).ans << '\n';
    }
  }
}
