#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
const int logN = 20;
const long long INF = 1e18;
vector<long long> L, R;
int n, q;
pair<long long, long long> maxL[N][logN], maxR[N][logN];
long long sum[N], d[N], h[N];
pair<long long, long long> maximize(pair<long long, long long> u,
                                    pair<long long, long long> v,
                                    const vector<long long>& arr) {
  if (arr[u.first] < arr[v.first]) swap(u, v);
  return {u.first, (arr[u.second] > arr[v.first] ? u.second : v.first)};
}
pair<long long, long long> getmaxL(int l, int r) {
  pair<long long, long long> ans = {0, 0};
  for (int i = logN - 1; i >= 0; --i) {
    if (l + (1 << i) - 1 <= r) {
      ans = maximize(ans, maxL[l][i], L);
      l += (1 << i);
    }
  }
  return ans;
}
pair<long long, long long> getmaxR(int l, int r) {
  pair<long long, long long> ans = {0, 0};
  for (int i = logN - 1; i >= 0; --i) {
    if (l + (1 << i) - 1 <= r) {
      ans = maximize(ans, maxR[l][i], R);
      l += (1 << i);
    }
  }
  return ans;
}
long long get(int l, int r) {
  if (l > r) return 0;
  pair<long long, long long> u = getmaxL(l, r), v = getmaxR(l, r);
  if (u.first != v.first) return L[u.first] + R[v.first];
  return max(L[u.first] + R[v.second], L[u.second] + R[v.first]);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.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];
  for (int(i) = (1); (i) <= (2 * n); ++(i)) sum[i] = sum[i - 1] + d[i];
  L.assign(2 * n + 1, 0);
  R.assign(2 * n + 1, 0);
  for (int(i) = (1); (i) <= (2 * n); ++(i)) L[i] = 2 * h[i] - sum[i - 1];
  for (int(i) = (1); (i) <= (2 * n); ++(i)) R[i] = 2 * h[i] + sum[i - 1];
  L[0] = R[0] = -INF;
  for (int(i) = (1); (i) <= (2 * n); ++(i)) maxL[i][0] = maxR[i][0] = {i, 0};
  for (int j = 1; j < logN; ++j)
    for (int i = 1; i <= 2 * n; ++i) {
      if (i + (1 << j) - 1 <= 2 * n) {
        maxL[i][j] =
            maximize(maxL[i][j - 1], maxL[i + (1 << (j - 1))][j - 1], L);
        maxR[i][j] =
            maximize(maxR[i][j - 1], maxR[i + (1 << (j - 1))][j - 1], R);
      }
    }
  while (q--) {
    int l, r;
    cin >> l >> r;
    if (l <= r)
      cout << get(r + 1, l + n - 1) << '\n';
    else
      cout << get(r + 1 + n, l + n - 1) << '\n';
  }
}
