#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  char c = getchar();
  long long x = 0;
  bool f = 0;
  for (; !isdigit(c); c = getchar()) f ^= !(c ^ 45);
  for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  if (f) x = -x;
  return x;
}
const long long maxn = 100050, inf = 1e17;
long long n, m, d[maxn << 1], dsum[maxn << 1], h[maxn << 1];
struct Tree {
  long long lsum, rsum, Max;
  Tree() {}
  Tree(long long _lsum, long long _rsum, long long _Max) {
    lsum = _lsum;
    rsum = _rsum;
    Max = _Max;
  }
} tree[maxn << 3];
void push_up(long long rt) {
  tree[rt] = Tree(max(tree[rt << 1].lsum, tree[rt << 1 | 1].lsum),
                  max(tree[rt << 1].rsum, tree[rt << 1 | 1].rsum),
                  max(max(tree[rt << 1].Max, tree[rt << 1 | 1].Max),
                      tree[rt << 1].lsum + tree[rt << 1 | 1].rsum));
}
void build(long long l, long long r, long long rt) {
  if (l == r)
    tree[rt] = Tree(h[l] * 2 - dsum[l], h[l] * 2 + dsum[l], -inf);
  else {
    long long mid = (l + r) >> 1;
    build(l, mid, rt << 1);
    build(mid + 1, r, rt << 1 | 1);
    push_up(rt);
  }
}
Tree query(long long L, long long R, long long l, long long r, long long rt) {
  if (L <= l && r <= R) return tree[rt];
  Tree t1, t2;
  t1 = t2 = Tree(-inf, -inf, -inf);
  long long mid = (l + r) >> 1;
  if (L <= mid) t1 = query(L, R, l, mid, rt << 1);
  if (R > mid) t2 = query(L, R, mid + 1, r, rt << 1 | 1);
  return Tree(max(t1.lsum, t2.lsum), max(t1.rsum, t2.rsum),
              max(max(t1.Max, t2.Max), t1.lsum + t2.rsum));
}
signed main() {
  n = read();
  m = read();
  for (register long long i = (1); i <= (n); ++i) d[i] = d[i + n] = read();
  for (register long long i = (1); i <= (n << 1); ++i)
    dsum[i] = dsum[i - 1] + d[i - 1];
  for (register long long i = (1); i <= (n); ++i) h[i] = h[i + n] = read();
  build(1, n << 1, 1);
  while (m--) {
    long long a = read(), b = read();
    if (a > b)
      printf("%lld\n", query(b + 1, a - 1, 1, n << 1, 1).Max);
    else
      printf("%lld\n", query(b + 1, a + n - 1, 1, n << 1, 1).Max);
  }
  return 0;
}
