#include <bits/stdc++.h>
const int maxn = 2e5 + 10;
using namespace std;
long long a[maxn << 2], b[maxn << 2], s[maxn << 2];
long long d[maxn], h[maxn];
int n, m;
struct node {
  long long a, b, mx;
  node(long long a, long long b, long long mx) : a(a), b(b), mx(mx) {}
};
node null = node(-(long long)(~0ull >> 2), -(long long)(~0ull >> 2), 0);
void push_up(int rt) {
  a[rt] = max(a[rt << 1], a[rt << 1 | 1]);
  b[rt] = max(b[rt << 1], b[rt << 1 | 1]);
  s[rt] = max(a[rt << 1] + b[rt << 1 | 1], max(s[rt << 1], s[rt << 1 | 1]));
}
void build(int l, int r, int rt) {
  if (l == r) {
    a[rt] = 2 * h[l] - d[l - 1];
    b[rt] = 2 * h[l] + d[l - 1];
    s[rt] = 0;
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  push_up(rt);
}
void _merge(node x, node y, node& z) {
  z.mx = max(x.mx, y.mx);
  z.a = max(x.a, y.a);
  z.b = max(x.b, y.b);
  z.mx = max(z.mx, x.a + y.b);
}
node query(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) {
    node x = node(a[rt], b[rt], s[rt]);
    return x;
  }
  int m = (l + r) >> 1;
  node lx = null, ry = null, res = null;
  if (L <= m) lx = query(L, R, l, m, rt << 1);
  if (m < R) ry = query(L, R, m + 1, r, rt << 1 | 1);
  if (lx.a == -(long long)(~0ull >> 2)) {
    res.a = max(res.a, ry.a);
    res.b = max(res.b, ry.b);
    res.mx = max(res.mx, ry.mx);
  } else if (ry.a == -(long long)(~0ull >> 2)) {
    res.a = max(res.a, lx.a);
    res.b = max(res.b, lx.b);
    res.mx = max(res.mx, lx.mx);
  } else
    _merge(lx, ry, res);
  return res;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%I64d", &d[i]);
  for (int i = 1; i <= n; ++i) scanf("%I64d", &h[i]);
  for (int i = 1; i <= n; ++i) {
    d[i + n] = d[i];
    h[i + n] = h[i];
  }
  for (int i = 1; i <= (n << 1); ++i) d[i] = d[i - 1] + d[i];
  build(1, n << 1, 1);
  int x, y;
  long long A, B;
  while (m--) {
    scanf("%d%d", &x, &y);
    if (x <= y)
      printf("%I64d\n", query(y + 1, x + n - 1, 1, n << 1, 1).mx);
    else
      printf("%I64d\n", query(y + 1, x - 1, 1, n << 1, 1).mx);
  }
  return 0;
}
