#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m;
long long res, d[N], dis[N], h[N], ans[N << 2];
pair<long long, long long> val[N << 2];
pair<long long, long long> merge(pair<long long, long long> a,
                                 pair<long long, long long> b) {
  res = max(res, a.first + b.second);
  return make_pair(max(a.first, b.first), max(a.second, b.second));
}
void upd(int x) {
  ans[x] = max(ans[x << 1], ans[x << 1 | 1]);
  ans[x] = max(ans[x], val[x << 1].first + val[x << 1 | 1].second);
  val[x] = merge(val[x << 1], val[x << 1 | 1]);
}
void build(int x, int l, int r) {
  if (l == r) {
    ans[x] = -1e18;
    val[x] = make_pair(2ll * h[l] - dis[l], 2ll * h[l] + dis[l]);
    return;
  }
  int mid = (l + r) >> 1;
  build(x << 1, l, mid), build(x << 1 | 1, mid + 1, r);
  upd(x);
}
pair<long long, long long> query(int x, int l, int r, int lx, int rx) {
  if (lx <= l && r <= rx) {
    res = max(res, ans[x]);
    return val[x];
  }
  int mid = (l + r) >> 1;
  if (rx <= mid) return query(x << 1, l, mid, lx, rx);
  if (lx > mid) return query(x << 1 | 1, mid + 1, r, lx, rx);
  return merge(query(x << 1, l, mid, lx, rx),
               query(x << 1 | 1, mid + 1, r, lx, rx));
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &d[i]);
    d[i + n] = d[i];
  }
  for (int i = 1; i <= 2 * n; i++) {
    dis[i] = dis[i - 1] + d[i - 1];
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &h[i]);
    h[i + n] = h[i];
  }
  build(1, 1, 2 * n);
  for (int i = 1; i <= m; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    res = 0;
    if (l <= r) {
      query(1, 1, 2 * n, r + 1, l + n - 1);
    } else {
      query(1, 1, 2 * n, r + 1, l - 1);
    }
    printf("%lld\n", res);
  }
  return 0;
}
