#include <bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const int inf = 2e9;
const long long linf = 1e18;
struct cvor {
  long long lm, rm, ans;
} seg[4 * N];
long long p[N], h[N];
cvor combine(cvor ls, cvor rs, int l, int r) {
  int m = l + r >> 1;
  cvor ans;
  if (ls.ans == 0) return rs;
  if (rs.ans == 0) return ls;
  ans.lm = max(ls.lm, rs.lm + p[m] - (l == 0 ? 0 : p[l - 1]));
  ans.rm = max(rs.rm, ls.rm + p[r - 1] - (m == 0 ? 0 : p[m - 1]));
  ans.ans =
      max({ls.ans, rs.ans, ls.rm + p[m] - (m == 0 ? 0 : p[m - 1]) + rs.lm});
  return ans;
}
void init(int node, int l, int r) {
  if (l == r) {
    seg[node].lm = seg[node].rm = seg[node].ans = 2 * h[l];
    return;
  }
  int m = l + r >> 1;
  init(2 * node, l, m);
  init(2 * node + 1, m + 1, r);
  seg[node] = combine(seg[2 * node], seg[2 * node + 1], l, r);
}
void print(int l, int r, cvor m) {
  cout << l << ' ' << r << ' ' << m.lm << ' ' << m.rm << ' ' << m.ans << '\n';
}
cvor query(int node, int ss, int se, int qs, int qe) {
  if (se < qs || qe < ss || qs > qe) return {0, 0, 0};
  if (qs <= ss && se <= qe) return seg[node];
  int m = ss + se >> 1;
  cvor ls = query(2 * node, ss, m, qs, qe);
  cvor rs = query(2 * node + 1, m + 1, se, qs, qe);
  return combine(ls, rs, ss, se);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, q;
  cin >> n >> q;
  for (int i = 0; i < n; i++) {
    cin >> p[i];
    p[i + n] = p[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  for (int i = 1; i < 2 * n; i++) {
    p[i] += p[i - 1];
  }
  init(1, 0, 2 * n - 1);
  while (q--) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    if (a <= b)
      cout << query(1, 0, 2 * n - 1, b + 1, a + n - 1).ans << '\n';
    else
      cout << query(1, 0, 2 * n - 1, b + 1, a - 1).ans << '\n';
  }
  return 0;
}
