#include <bits/stdc++.h>
using namespace std;
const int inf = 1000000000, N = 100000;
struct node {
  long long pre, suf, max, sum;
};
node none = (node){0, 0, -1, 0};
node merge(node le, node ri) {
  if (le.max == -1) return ri;
  if (ri.max == -1) return le;
  node nw;
  nw.max = max(le.suf + ri.pre, max(le.max, ri.max));
  nw.pre = max(le.pre, ri.pre + le.sum);
  nw.suf = max(ri.suf, le.suf + ri.sum);
  nw.sum = le.sum + ri.sum;
  return nw;
}
node ST[4 * N + 5];
int n, m;
long long d[N + 5], h[N + 5];
node init(int i, int b, int s) {
  if (b == s) return ST[i] = (node){2 * h[b], 2 * h[b] + d[b], 0, d[b]};
  int o = (b + s) / 2;
  return ST[i] = merge(init(2 * i, b, o), init(2 * i + 1, o + 1, s));
}
node query(int i, int b, int s, int x, int y) {
  if (x > s || y < b) return none;
  if (x <= b && y >= s) return ST[i];
  int o = (b + s) / 2;
  return merge(query(2 * i, b, o, x, y), query(2 * i + 1, o + 1, s, x, y));
}
int main() {
  int x, y;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%lld", d + i);
  for (int i = 1; i <= n; i++) scanf("%lld", h + i);
  init(1, 1, n);
  while (m--) {
    scanf("%d %d", &x, &y);
    if (x <= y) {
      node n1 = none, n2 = none;
      if (y < n) n1 = query(1, 1, n, y + 1, n);
      if (x > 1) n2 = query(1, 1, n, 1, x - 1);
      node ans = merge(n1, n2);
      if (ans.max == -1) ans.max = 0;
      printf("%lld\n", ans.max);
    } else {
      if (y + 1 <= x - 1)
        printf("%lld\n", query(1, 1, n, y + 1, x - 1).max);
      else
        puts("0");
    }
  }
  return 0;
}
