#include <bits/stdc++.h>
using namespace std;
const long long N = 6e5 + 5;
long long n, m;
long long d[N], h[N];
struct node {
  long long l, r, max;
} T[N << 2];
inline node pushup(node L, node R) {
  node res;
  res.l = max(L.l, R.l);
  res.r = max(R.r, L.r);
  res.max = max(L.l + R.r, max(L.max, R.max));
  return res;
}
void build(long long k, long long l, long long r) {
  if (l == r) {
    T[k].max = 0;
    T[k].l = 2 * h[l] - d[l - 1];
    T[k].r = 2 * h[l] + d[l - 1];
    return;
  }
  long long mid = l + r >> 1;
  build(k << 1, l, mid);
  build(k << 1 | 1, mid + 1, r);
  node L, R;
  L = T[k << 1];
  R = T[k << 1 | 1];
  T[k] = pushup(L, R);
}
node query(long long k, long long l, long long r, long long qx, long long qy) {
  if (qx <= l && r <= qy) return T[k];
  long long mid = l + r >> 1;
  if (qx > mid) return query(k << 1 | 1, mid + 1, r, qx, qy);
  if (qy <= mid) return query(k << 1, l, mid, qx, qy);
  node L, R;
  L = query(k << 1, l, mid, qx, qy);
  R = query(k << 1 | 1, mid + 1, r, qx, qy);
  return pushup(L, R);
}
signed main() {
  scanf("%lld%lld", &n, &m);
  for (register long long i = 1; i <= n; ++i)
    scanf("%lld", &d[i]), d[i + n] = d[i];
  for (register long long i = 1; i <= n; ++i)
    scanf("%lld", &h[i]), h[i + n] = h[i];
  long long len = n;
  n <<= 1;
  for (register long long i = 1; i <= n; ++i) d[i] += d[i - 1];
  build(1, 1, n);
  while (m--) {
    long long x, y;
    scanf("%lld%lld", &x, &y);
    if (x <= y)
      printf("%lld\n", query(1, 1, n, y + 1, x + len - 1).max);
    else
      printf("%lld\n", query(1, 1, n, y + 1, x - 1).max);
  }
  return 0;
}
