#include <bits/stdc++.h>
using namespace std;
struct node {
  long long ans, lx, rx, dist;
  node() { ans = lx = rx = dist = 0; }
};
node tree[2222222];
long long h[2222222], d[2222222];
node comb(node a, node b, long long dist) {
  node res;
  res.dist = a.dist + b.dist + dist;
  res.lx = max(a.lx, a.dist + dist + b.lx);
  res.rx = max(b.rx, b.dist + dist + a.rx);
  res.ans = max(max(a.ans, b.ans), a.rx + dist + b.lx);
  return res;
}
void build(long long node, long long b, long long e) {
  if (b == e) {
    tree[node].lx = tree[node].rx = 2 * h[b];
  } else {
    build(2 * node, b, (b + e) / 2);
    build(2 * node + 1, 1 + (b + e) / 2, e);
    tree[node] = comb(tree[2 * node], tree[2 * node + 1], d[(b + e) / 2]);
  }
}
node query(long long n, long long b, long long e, long long l, long long r) {
  if (r < b || l > e || b > e) return node();
  if (b >= l && e <= r)
    return tree[n];
  else {
    node x = query(2 * n, b, (b + e) / 2, l, r);
    node y = query(2 * n + 1, 1 + (b + e) / 2, e, l, r);
    if (l <= (b + e) / 2 && r > (b + e) / 2)
      return comb(x, y, d[(b + e) / 2]);
    else if (l <= (b + e) / 2)
      return x;
    else if (r > (b + e) / 2)
      return y;
    else
      return node();
  }
}
int main() {
  long long n, m, a, b;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) scanf("%I64d", &d[i]);
  for (int i = n + 1; i < 2 * n; i++) d[i] = d[i - n];
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", &h[i]);
    h[n + i] = h[i];
  }
  build(1, 1, 2 * n - 1);
  while (m--) {
    scanf("%I64d %I64d", &a, &b);
    long long l, r;
    if (a <= b)
      l = b + 1, r = n + a - 1;
    else
      l = b + 1, r = a - 1;
    node res = query(1, 1, 2 * n - 1, l, r);
    printf("%I64d\n", res.ans);
  }
  return 0;
}
