#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  char ch = getchar();
  long long x = 0;
  while (ch < '0' || ch > '9') ch = getchar();
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x;
}
int n, m;
long long sum[200005], h[200005], a[200005];
struct nade {
  long long Max, Min, ans;
  void clear() { Max = Min = ans = -1e17; }
} t[200005 << 2];
void pudo(nade &a, nade b, nade c) {
  a.Max = max(b.Max, c.Max);
  a.Min = max(b.Min, c.Min);
  a.ans = max(b.Min + c.Max, max(b.ans, c.ans));
}
void build(int x, int l, int r) {
  if (l == r) {
    t[x].clear();
    t[x].Max = sum[l - 1] + 2 * h[l];
    t[x].Min = -sum[l - 1] + 2 * h[l];
    return;
  }
  int mid = (l + r) >> 1;
  build(x << 1, l, mid);
  build(x << 1 | 1, mid + 1, r);
  pudo(t[x], t[x << 1], t[x << 1 | 1]);
}
nade ask(int x, int l, int r, int L, int R) {
  if (l >= L && r <= R) return t[x];
  nade rec;
  rec.clear();
  int mid = (l + r) >> 1;
  if (mid >= L) pudo(rec, rec, ask(x << 1, l, mid, L, R));
  if (mid + 1 <= R) pudo(rec, rec, ask(x << 1 | 1, mid + 1, r, L, R));
  return rec;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) a[i] = a[i + n] = read();
  for (int i = 1; i <= n; i++) h[i] = h[i + n] = read();
  n <<= 1;
  for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
  build(1, 1, n);
  for (int l, r; m--;) {
    l = read();
    r = read();
    if (l <= r)
      printf("%lld\n", ask(1, 1, n, r + 1, l + n / 2 - 1).ans);
    else
      printf("%lld\n", ask(1, 1, n, r + 1, l - 1).ans);
  }
}
