#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, Q;
long long d[N], h[N];
struct node {
  long long valx, valy, mx;
} tr[N << 2];
inline node Merge(node x, node y) {
  node res;
  res.valx = max(x.valx, y.valx);
  res.valy = max(x.valy, y.valy);
  res.mx = max(max(x.mx, y.mx), x.valx + y.valy);
  return res;
}
inline void update(int x) {
  if (!x) return;
  int lc = x << 1, rc = x << 1 | 1;
  tr[x].valx = max(tr[lc].valx, tr[rc].valx);
  tr[x].valy = max(tr[lc].valy, tr[rc].valy);
  tr[x].mx = max(max(tr[lc].mx, tr[rc].mx), tr[lc].valx + tr[rc].valy);
}
void Build(int l, int r, int k) {
  if (l == r) {
    tr[k].valx = h[l] - d[l - 1];
    tr[k].valy = h[l] + d[l - 1];
    tr[k].mx = 0;
    return;
  }
  int mid = (l + r) >> 1;
  Build(l, mid, k << 1);
  Build(mid + 1, r, k << 1 | 1);
  update(k);
}
node Query(int l, int r, int k, int x, int y) {
  if (x <= l && r <= y) return tr[k];
  int mid = (l + r) >> 1;
  if (x > mid) return Query(mid + 1, r, k << 1 | 1, x, y);
  if (y <= mid) return Query(l, mid, k << 1, x, y);
  return Merge(Query(l, mid, k << 1, x, y),
               Query(mid + 1, r, k << 1 | 1, x, y));
}
int main(void) {
  scanf("%d%d", &n, &Q);
  for (int i = 1; i <= n; ++i) scanf("%lld", &d[i]);
  for (int i = 1; i <= n; ++i) scanf("%lld", &h[i]);
  for (int i = 1; i <= n; ++i) {
    h[i] <<= 1;
    d[i + n] = d[i];
    h[i + n] = h[i];
  }
  for (int i = 2; i <= n + n; ++i) d[i] += d[i - 1];
  Build(1, n << 1, 1);
  while (Q--) {
    int l, r, x, y;
    scanf("%d%d", &l, &r);
    if (l <= r)
      x = r + 1, y = l + n - 1;
    else
      x = r + 1, y = l - 1;
    printf("%lld\n", Query(1, n << 1, 1, x, y).mx);
  }
  return 0;
}
