#include <bits/stdc++.h>
const int MAXN = 400001;
const int MAXT = 800001;
const long long INF = 1ll << 50;
struct Node {
  long long zmax, zmin, zsum;
  Node() {
    zmax = -INF;
    zmin = INF;
    zsum = -INF;
  }
  Node(long long dmin, long long dmax) {
    zsum = -INF;
    zmax = dmax;
    zmin = dmin;
  }
  Node operator+(const Node &p) const {
    Node ret;
    ret.zmin = std::min(zmin, p.zmin);
    ret.zmax = std::max(zmax, p.zmax);
    ret.zsum = std::max(std::max(zsum, p.zsum), p.zmax - zmin);
    return ret;
  }
} tree[MAXT];
int n, m, M, d[MAXN], h[MAXN];
long long s[MAXN];
Node query(int l, int r) {
  Node left = Node(), right = Node();
  for (l += M - 1, r += M + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
    if (l & 1 ^ 1) left = left + tree[l ^ 1];
    if (r & 1) right = tree[r ^ 1] + right;
  }
  return left + right;
}
int main() {
  std::ios::sync_with_stdio(false);
  std::cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    std::cin >> d[i];
    d[n + i] = d[i];
  }
  for (int i = 1; i <= n; i++) {
    std::cin >> h[i];
    h[n + i] = h[i];
  }
  for (int i = 1; i < 2 * n; i++) {
    s[i] = s[i - 1] + d[i - 1];
  }
  for (M = 1; M <= 2 * n + 1; M <<= 1)
    ;
  for (int i = 1; i <= 2 * n; i++) {
    tree[M + i] = Node(-2ll * h[i] + s[i], 2ll * h[i] + s[i]);
  }
  for (int i = M - 1; i >= 1; i--) {
    tree[i] = tree[i << 1] + tree[i << 1 ^ 1];
  }
  for (int i = 1; i <= m; i++) {
    int l, r;
    std::cin >> l >> r;
    Node ret = Node();
    if (l <= r) {
      ret = query(r + 1, l + n - 1);
    } else {
      ret = query(r + 1, l - 1);
    }
    std::cout << ret.zsum << std::endl;
  }
  return 0;
}
