#include <bits/stdc++.h>
using namespace std;
struct node {
  long long l, r, x, tot;
};
node tree[4 * 100002];
long long d[100002];
long long h[100002];
node merge(node lft, node rgt, long long idx) {
  node res;
  res.l = max(lft.l, lft.tot + rgt.l + d[idx]);
  res.r = max(rgt.r, rgt.tot + lft.r + d[idx]);
  res.tot = lft.tot + rgt.tot + d[idx];
  res.x = max(lft.r + rgt.l + d[idx], max(lft.x, rgt.x));
  return res;
}
void build(long long nd, long long lo, long long hi) {
  if (lo == hi) {
    tree[nd].l = tree[nd].r = tree[nd].x = h[lo], tree[nd].tot = 0;
    return;
  }
  long long md = (lo + hi) / 2;
  build(nd * 2, lo, md);
  build(nd * 2 + 1, md + 1, hi);
  tree[nd] = merge(tree[nd * 2], tree[nd * 2 + 1], md);
}
node query(long long nd, long long lo, long long hi, long long lf,
           long long rg) {
  node res;
  long long md = (lo + hi) / 2;
  if (lo >= lf and hi <= rg) return tree[nd];
  if (lf > md) return query(nd * 2 + 1, md + 1, hi, lf, rg);
  if (rg <= md) return query(nd * 2, lo, md, lf, rg);
  node x1 = query(nd * 2, lo, md, lf, rg);
  node x2 = query(nd * 2 + 1, md + 1, hi, lf, rg);
  res = merge(x1, x2, md);
  return res;
}
signed main() {
  ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  long long n, m;
  cin >> n >> m;
  for (long long i = 0; i <= n - 1; i++) cin >> d[i];
  for (long long i = 0; i <= n - 1; i++) cin >> h[i], h[i] *= 2;
  build(1, 0, n - 1);
  while (m--) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    if (a <= b) {
      if (b + 1 == n) {
        node x2 = query(1, 0, n - 1, 0, a - 1);
        cout << x2.x << "\n";
        continue;
      }
      if (a == 0) {
        node x1 = query(1, 0, n - 1, b + 1, n - 1);
        cout << x1.x << "\n";
        continue;
      }
      node x1 = query(1, 0, n - 1, b + 1, n - 1);
      node x2 = query(1, 0, n - 1, 0, a - 1);
      node x3 = merge(x1, x2, n - 1);
      cout << x3.x << "\n";
    } else {
      node x1 = query(1, 0, n - 1, b + 1, a - 1);
      cout << x1.x << "\n";
    }
  }
}
