#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 7;
const long long INF = 1e15;
long long min_sub[4 * MAXN], max_val[4 * MAXN], max_res[4 * MAXN], a[MAXN], q,
    ans[MAXN], x[MAXN];
int n, d[MAXN], h[MAXN];
pair<pair<int, int>, int> que[MAXN];
void build(int g, int l, int r) {
  if (l == r)
    return min_sub[g] = INF, max_val[g] = a[l], max_res[g] = a[l] - INF, void();
  int mid = (l + r) >> 1;
  build(g * 2, l, mid);
  build(g * 2 + 1, mid + 1, r);
  min_sub[g] = INF;
  max_res[g] = max(max_res[g * 2], max_res[g * 2 + 1]);
  max_val[g] = max(max_val[g * 2], max_val[g * 2 + 1]);
}
void lp(int g) {
  if (min_sub[g] != INF) {
    min_sub[g * 2] = min(min_sub[g], min_sub[g * 2]);
    min_sub[g * 2 + 1] = min(min_sub[g], min_sub[g * 2 + 1]);
    max_res[g * 2] = max(max_res[g * 2], max_val[g * 2] - min_sub[g * 2]);
    max_res[g * 2 + 1] =
        max(max_res[g * 2 + 1], max_val[g * 2 + 1] - min_sub[g * 2 + 1]);
    min_sub[g] = INF;
  }
}
void upd(int g, int l, int r, int d, int c, long long delta) {
  if (l > c || r < d) return;
  if (d <= l && r <= c) {
    min_sub[g] = min(min_sub[g], delta);
    max_res[g] = max(max_res[g], max_val[g] - min_sub[g]);
    return;
  }
  lp(g);
  int mid = (l + r) >> 1;
  upd(g * 2, l, mid, d, c, delta);
  upd(g * 2 + 1, mid + 1, r, d, c, delta);
  max_res[g] = max(max_res[g * 2], max_res[g * 2 + 1]);
}
long long get(int g, int l, int r, int d, int c) {
  if (l > c || r < d) return -INF;
  if (d <= l && r <= c) return max_res[g];
  lp(g);
  int mid = (l + r) >> 1;
  return max(get(g * 2, l, mid, d, c), get(g * 2 + 1, mid + 1, r, d, c));
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) cin >> d[i], d[i + n] = d[i];
  for (int i = 1; i <= n; ++i) cin >> h[i], h[i + n] = h[i];
  d[0] = x[0] = 0;
  for (int i = 1; i <= 2 * n; ++i) {
    x[i] = x[i - 1] + 1LL * d[i - 1];
    a[i] = x[i] + 2LL * h[i];
  }
  n *= 2;
  build(1, 1, n);
  for (int i = 1; i <= q; ++i) {
    int l, r;
    cin >> l >> r;
    if (l <= r)
      que[i].first.first = r + 1, que[i].first.second = n / 2 + l - 1;
    else
      que[i].first.second = l - 1, que[i].first.first = r + 1;
    que[i].second = i;
  }
  sort(que + 1, que + 1 + q);
  int fin = n - 1;
  for (int i = q; i >= 1; --i) {
    while (fin >= que[i].first.first)
      upd(1, 1, n, fin + 1, n, x[fin] - 2LL * h[fin]), --fin;
    int id = que[i].second;
    ans[id] = get(1, 1, n, que[i].first.first, que[i].first.second);
  }
  for (int i = 1; i <= q; ++i) cout << ans[i] << '\n';
  return 0;
}
