#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
const int M = 1e5 + 5;
const int NM = 2e6 + 1;
const int base = 233;
const long long mod = 1e9 + 9;
const long long INF = 1e15;
inline void rd(long long &x) {
  x = 0;
  char ch = getchar();
  bool flag = 0;
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') flag = 1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10ll + ch - '0', ch = getchar();
  if (flag) x = -x;
  return;
}
inline void rd(int &x) {
  x = 0;
  char ch = getchar();
  bool flag = 0;
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') flag = 1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  if (flag) x = -x;
  return;
}
inline char rch() {
  char c;
  while ((c = getchar()) != 'N' && c != 'E')
    ;
  return c;
}
int n, m, a[N], h[N];
long long sum[N], f[N], g[N];
int tf[N << 2], tg[N << 2];
inline int Min(int x, int y) { return g[x] < g[y] ? x : y; }
inline int Max(int x, int y) { return f[x] > f[y] ? x : y; }
inline void built(int k, int l, int r) {
  if (l == r) {
    tf[k] = l;
    tg[k] = l;
  } else {
    int mid = (l + r) >> 1;
    built(k << 1, l, mid);
    built(k << 1 | 1, mid + 1, r);
    tf[k] = Max(tf[k << 1], tf[k << 1 | 1]);
    tg[k] = Min(tg[k << 1], tg[k << 1 | 1]);
  }
}
inline int query(int k, int l, int r, int L, int R, int op) {
  if (L <= l && r <= R) {
    if (op == 1)
      return tf[k];
    else
      return tg[k];
  } else {
    int mid = (l + r) >> 1;
    int ans = 0;
    if (op == 1) {
      if (mid >= L) ans = Max(ans, query(k << 1, l, mid, L, R, op));
      if (mid < R) ans = Max(ans, query(k << 1 | 1, mid + 1, r, L, R, op));
    } else {
      if (mid >= L) ans = Min(ans, query(k << 1, l, mid, L, R, op));
      if (mid < R) ans = Min(ans, query(k << 1 | 1, mid + 1, r, L, R, op));
    }
    return ans;
  }
}
int main() {
  rd(n);
  rd(m);
  for (int i = 1; i <= n; ++i) {
    rd(a[(i % n) + 1]);
    a[(i % n) + 1 + n] = a[(i % n) + 1];
  }
  for (int i = 1; i <= n; ++i) rd(h[i]);
  for (int i = 1; i <= n; ++i) {
    sum[i] = sum[i - 1] + a[i];
    a[i + n] = a[i];
    h[i + n] = h[i];
  }
  for (int i = 1; i <= n; ++i) {
    sum[i + n] = sum[i + n - 1] + a[i];
    f[i] = sum[i] + 2ll * h[i];
    f[i + n] = sum[i + n] + 2ll * h[i + n];
    g[i] = sum[i] - 2ll * h[i];
    g[i + n] = sum[i + n] - 2ll * h[i + n];
  }
  f[0] = -INF;
  g[0] = INF;
  built(1, 1, n + n);
  int l, r;
  while (m--) {
    rd(l);
    rd(r);
    if (l <= r) {
      int x = l;
      l = r + 1;
      r = x + n - 1;
    } else {
      swap(l, r);
      ++l;
      --r;
    }
    int MAX = query(1, 1, n + n, l, r, 1);
    int MIN = query(1, 1, n + n, l, r, 0);
    if (MAX == MIN) {
      int a1 = Min(query(1, 1, n + n, l, MAX - 1, 0),
                   query(1, 1, n + n, MAX + 1, r, 0));
      int b1 = Max(query(1, 1, n + n, l, MAX - 1, 1),
                   query(1, 1, n + n, MAX + 1, r, 1));
      printf("%lld\n", max(f[MAX] - g[a1], f[b1] - g[MIN]));
    } else {
      printf("%lld\n", f[MAX] - g[MIN]);
    }
  }
  return 0;
}
