#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300005;
pair<long long int, long long int> Tree1[4 * MAXN], Tree2[4 * MAXN];
long long int val1[MAXN], val2[MAXN];
long long int d[MAXN], H[MAXN], N, M;
inline pair<long long int, long long int> merge(
    pair<long long int, long long int> a,
    pair<long long int, long long int> b) {
  if (a.first >= b.first) return a;
  return b;
}
void build(long long int node, long long int start, long long int end) {
  if (start == end) {
    Tree1[node] = make_pair(val1[start], start);
    Tree2[node] = make_pair(val2[start], start);
  } else {
    long long int mid = (start + end) / 2;
    build(2 * node, start, mid);
    build(2 * node + 1, mid + 1, end);
    Tree1[node] = merge(Tree1[2 * node], Tree1[2 * node + 1]);
    Tree2[node] = merge(Tree2[2 * node], Tree2[2 * node + 1]);
  }
}
pair<long long int, long long int> query(long long int node,
                                         long long int start, long long int end,
                                         long long int l, long long int r,
                                         long long int k) {
  if (start > end || l > end || r < start)
    return make_pair(-1000000000000000, 0);
  if (l <= start && end <= r) {
    return k ? Tree1[node] : Tree2[node];
  }
  long long int mid = (start + end) / 2;
  pair<long long int, long long int> left = make_pair(-1000000000000000, 0),
                                     right = make_pair(-1000000000000000, 0);
  if (l <= mid) left = query(2 * node, start, mid, l, r, k);
  if (mid + 1 <= r) right = query(2 * node + 1, mid + 1, end, l, r, k);
  return merge(left, right);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> N >> M;
  d[0] = 0, H[0] = 0;
  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++) {
    d[i] += d[i - 1];
    val1[i] = 2 * H[i] + d[i - 1];
    val1[i + N] = val1[i];
    val2[i] = 2 * H[i] - d[i - 1];
    val2[i + N] = val2[i];
  }
  build(1, 1, 2 * N);
  long long int a, b, u, v;
  pair<long long int, long long int> p1, p2, p3, p4;
  while (M--) {
    cin >> a >> b;
    if (a <= b) {
      u = b + 1, v = a + N - 1;
    } else {
      u = b + 1, v = a - 1;
    }
    p1 = query(1, 1, 2 * N, u, v, 1);
    p2 = merge(query(1, 1, 2 * N, u, p1.second - 1, 0),
               query(1, 1, 2 * N, p1.second + 1, v, 0));
    p3 = query(1, 1, 2 * N, u, v, 0);
    p4 = merge(query(1, 1, 2 * N, u, p3.second - 1, 1),
               query(1, 1, 2 * N, p3.second + 1, v, 1));
    cout << max(p1.first + p2.first, p3.first + p4.first) << endl;
  }
}
