#include <bits/stdc++.h>
using namespace std;
struct Ans {
  long long maxm, maxp, lmr, rml;
  Ans() { maxm = maxp = lmr = rml = -(1ll << 60); }
} node[100010 << 2];
void Union(Ans &o, Ans a, Ans b) {
  o.maxm = max(a.maxm, b.maxm);
  o.maxp = max(a.maxp, b.maxp);
  o.lmr = max(max(a.lmr, b.lmr), a.maxp + b.maxm);
  o.rml = max(max(a.rml, b.rml), a.maxm + b.maxp);
}
long long h[100010], d[100010], n;
void build(int o, int l, int r) {
  if (l == r) {
    node[o].maxm = 2 * h[l] - (long long)d[l];
    node[o].maxp = 2 * h[l] + (long long)d[l];
    node[o].rml = -(1ll << 60);
    node[o].lmr = -(1ll << 60);
    return;
  }
  build((o << 1), l, ((l + r) >> 1));
  build((o << 1 | 1), ((l + r) >> 1) + 1, r);
  Union(node[o], node[(o << 1)], node[(o << 1 | 1)]);
}
Ans query(int L, int R, int o = 1, int l = 1, int r = n) {
  Ans ret;
  if (L > R) return ret;
  if (L <= l && r <= R) return node[o];
  if (R <= ((l + r) >> 1)) return query(L, R, (o << 1), l, ((l + r) >> 1));
  if (L > ((l + r) >> 1))
    return query(L, R, (o << 1 | 1), ((l + r) >> 1) + 1, r);
  Union(ret, query(L, R, (o << 1), l, ((l + r) >> 1)),
        query(L, R, (o << 1 | 1), ((l + r) >> 1) + 1, r));
  return ret;
}
int Q;
Ans ansl, ansr;
int main() {
  scanf("%d%d", &n, &Q);
  for (int i = 1; i <= n; i++) {
    cin >> d[i + 1];
    d[i + 1] += d[i];
  }
  for (int i = 1; i <= n; i++) cin >> h[i];
  build(1, 1, n);
  while (Q--) {
    int l, r;
    scanf("%d %d", &l, &r);
    if (l <= r) {
      ansl = query(r + 1, n);
      ansr = query(1, l - 1);
      cout << max(max(ansr.rml, ansl.rml), ansr.maxp + d[n + 1] + ansl.maxm)
           << endl;
    } else {
      cout << query(r + 1, l - 1).rml << endl;
    }
  }
  return 0;
}
