#include <bits/stdc++.h>
using namespace std;
const int maxn = (int)2e5 + 10;
const int inf = (int)1e9;
const int mod = (int)1e9 + 7;
const double eps = 1e-9;
struct tree {
  long long ans, Left, Right;
};
tree t[4 * maxn];
long long d[maxn], sum[maxn], h[maxn];
int n, m;
void build(int v, int tl, int tr) {
  if (tl == tr) {
    t[v].ans = 0;
    t[v].Left = t[v].Right = 2 * h[tl];
    return;
  }
  int mid = (tl + tr) / 2;
  build(v + v, tl, mid);
  build(v + v + 1, mid + 1, tr);
  t[v].ans = max(max(t[v + v].ans, t[v + v + 1].ans),
                 t[v + v].Right + t[v + v + 1].Left + d[mid]);
  t[v].Left = max(t[v + v].Left, sum[mid] - sum[tl - 1] + t[v + v + 1].Left);
  t[v].Right =
      max(t[v + v + 1].Right, sum[tr - 1] - sum[mid - 1] + t[v + v].Right);
  return;
}
tree get(int v, int tl, int tr, int l, int r) {
  if (l == tl && r == tr) return t[v];
  int mid = (tl + tr) / 2;
  if (l > mid) return get(v + v + 1, mid + 1, tr, l, r);
  if (r <= mid) return get(v + v, tl, mid, l, r);
  tree resl, resr, res;
  resl = get(v + v, tl, mid, l, min(mid, r));
  resr = get(v + v + 1, mid + 1, tr, max(l, mid + 1), r);
  res.ans = max(max(resl.ans, resr.ans), resl.Right + resr.Left + d[mid]);
  res.Left = max(resl.Left, sum[mid] - sum[tl - 1] + resr.Left);
  res.Right = max(resr.Right, sum[tr - 1] - sum[mid - 1] + resl.Right);
  return res;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> d[i];
  for (int i = 1; i <= n; ++i) cin >> h[i];
  for (int i = 1; i <= n; ++i) h[i + n] = h[i], d[i + n] = d[i];
  for (int i = 1; i <= n + n; ++i) sum[i] = sum[i - 1] + d[i];
  build(1, 1, n + n);
  int a, b;
  for (int i = 1; i <= m; ++i) {
    cin >> a >> b;
    if (a <= b)
      cout << get(1, 1, n + n, b + 1, a - 1 + n).ans << '\n';
    else
      cout << get(1, 1, n + n, b + 1, a - 1).ans << '\n';
  }
  return 0;
}
