#include <bits/stdc++.h>
using namespace std;
struct Eins {
  struct node {
    long long val;
    vector<long long> can;
    node(long long val = 0) : val(val) { can.resize(2, val); }
    friend node operator+(const node& a, const node& b) {
      node res;
      res.val = max({a.val, b.val, a.can[0] + b.can[1]});
      res.can[0] = max(a.can[0], b.can[0]);
      res.can[1] = max(a.can[1], b.can[1]);
      return res;
    }
  };
  vector<node> st;
  int n;
  Eins(vector<int>& h, vector<long long>& t) {
    n = (int)t.size();
    st.resize(n << 2 | 1);
    build(1, 1, n, h, t);
  }
  void build(int id, int l, int r, vector<int>& h, vector<long long>& t) {
    if (l == r) {
      st[id].val = h[l] * 2;
      st[id].can[0] = -t[l] + 2 * h[l];
      st[id].can[1] = t[l] + 2 * h[l];
      return;
    }
    int mid = l + r >> 1;
    build(id << 1, l, mid, h, t);
    build(id << 1 | 1, mid + 1, r, h, t);
    st[id] = st[id << 1] + st[id << 1 | 1];
  }
  node get(int id, int l, int r, int L, int R) {
    if (l > R || r < L) return node(-1e16);
    if (L <= l && r <= R) return st[id];
    int mid = l + r >> 1;
    return get(id << 1, l, mid, L, R) + get(id << 1 | 1, mid + 1, r, L, R);
  }
  long long get(int L, int R) { return get(1, 1, n, L, R).val; }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, q;
  cin >> n >> q;
  vector<int> d(n + 1), h(2 * n + 1);
  vector<long long> t(2 * n + 1);
  for (int i = 1; i <= n; i++) cin >> d[i];
  for (int i = 1; i <= n; i++) cin >> h[i], h[i + n] = h[i];
  for (int i = 1; i <= 2 * n; i++) {
    int pos = i - 1;
    if (pos > n) pos -= n;
    t[i] = t[i - 1] + d[pos];
  }
  Eins Tree(h, t);
  while (q--) {
    int l, r;
    cin >> l >> r;
    if (l > r) r += n;
    int nl = r + 1;
    int nr = r + n - (r - l) - 1;
    cout << Tree.get(nl, nr) << "\n";
  }
}
