#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int n, Q;
int d[maxn], H[maxn];
long long D[maxn];
const long long inf = ~0ULL >> 1;
struct Node {
  long long s, lmax, rmax;
} v[maxn << 2];
void build(int l, int r, int x) {
  v[x].s = -inf, v[x].lmax = -inf, v[x].rmax = -inf;
  if (l == r) {
    v[x].s = 2 * (H[l]);
    v[x].lmax = 2 * H[l] - D[l];
    v[x].rmax = 2 * H[l] + D[l];
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, x << 1), build(m + 1, r, x << 1 | 1);
  v[x].lmax = max(v[x << 1].lmax, v[x << 1 | 1].lmax);
  v[x].rmax = max(v[x << 1].rmax, v[x << 1 | 1].rmax);
  v[x].s = max(v[x << 1].s, v[x << 1 | 1].s);
  v[x].s = max(v[x].s, v[x << 1 | 1].rmax + v[x << 1].lmax);
}
long long Res, Lmax;
void ask(int l, int r, int x, int L, int R) {
  if (L <= l && r <= R) {
    Res = max(Res, v[x].s);
    Res = max(Res, v[x].rmax + Lmax);
    Lmax = max(Lmax, v[x].lmax);
    return;
  }
  int m = (l + r) >> 1;
  if (L <= m) ask(l, m, x << 1, L, R);
  if (R > m) ask(m + 1, r, x << 1 | 1, L, R);
}
int main() {
  scanf("%d%d", &n, &Q);
  for (int i = 0; i < (int)(n); ++i)
    scanf("%d", d + i + 1), D[i + 1] = d[i + 1];
  for (int i = 0; i < (int)(n); ++i) scanf("%d", H + i);
  for (int i = (n); i < (int)(n + n); ++i) H[i] = H[i - n];
  for (int i = (1); i < (int)(n); ++i) D[i + n] = d[i];
  for (int i = (1); i < (int)(n + n); ++i) D[i] += D[i - 1];
  build(0, n + n - 1, 1);
  while (Q--) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a, --b;
    if (a > b) b += n;
    int l = b + 1, r = l + (n - (b - a + 1)) - 1;
    Res = -inf;
    Lmax = -inf;
    ask(0, n + n - 1, 1, l, r);
    printf("%lld\n", Res);
  }
  return 0;
}
