#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
const long long INF = 1e18;
long long x[N], h[N];
struct SegmentTree {
  struct node {
    long long mn, mx, ans;
  };
  node t[4 * N];
  node merge(node a, node b) {
    node c;
    c.mn = min(a.mn, b.mn);
    c.mx = max(a.mx, b.mx);
    c.ans = max({a.ans, b.ans, b.mx - a.mn});
    return c;
  }
  void build(int v, int tl, int tr) {
    if (tl == tr) {
      t[v] = {-2 * h[tl] + x[tl], 2 * h[tl] + x[tl], 0};
      return;
    }
    int tm = (tl + tr) >> 1;
    build(v * 2, tl, tm);
    build(v * 2 + 1, tm + 1, tr);
    t[v] = merge(t[v * 2], t[v * 2 + 1]);
  }
  node get(int v, int tl, int tr, int l, int r) {
    if (l > r) {
      return {INF, -INF, 0};
    }
    if (tl == l && tr == r) {
      return t[v];
    }
    int tm = (tl + tr) >> 1;
    return merge(get(v * 2, tl, tm, l, min(r, tm)),
                 get(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
  }
} st;
void solve() {
  int n, q;
  cin >> n >> q;
  for (int i = 1; i <= n; i++) {
    long long d;
    cin >> d;
    x[i] = x[i - 1] + d;
  }
  for (int i = n + 1; i < 2 * n; i++) {
    x[i] = x[i - n] + x[n];
  }
  for (int i = 0; i < n; i++) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  st.build(1, 0, 2 * n - 1);
  while (q--) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    if (a <= b) {
      cout << st.get(1, 0, 2 * n - 1, b + 1, a + n - 1).ans << "\n";
    } else {
      cout << st.get(1, 0, 2 * n - 1, b + 1, a - 1).ans << "\n";
    }
  }
}
int main() {
  ios::sync_with_stdio(NULL), cin.tie(0), cout.tie(0);
  cout.setf(ios::fixed), cout.precision(20);
  solve();
}
