#include <bits/stdc++.h>
using namespace std;
struct node {
  int bgn, end;
  long long best, sum, l, r;
} seg[100005 * 4 * 2], zero;
int n, m;
long long h[100005], d[100005];
void merge(node &N, node L, node R) {
  N.sum = L.sum + R.sum;
  N.l = max(L.l, R.l + L.sum);
  N.r = max(R.r, L.r + R.sum);
  N.best = max(L.r + R.l, max(L.best, R.best));
}
void make(int lvl) {
  if (seg[lvl].bgn == seg[lvl].end) {
    int pos = seg[lvl].bgn;
    if (pos > n) {
      seg[lvl].sum = d[pos - n];
      seg[lvl].best = 0;
      seg[lvl].l = 2 * h[pos - n];
      seg[lvl].r = 2 * h[pos - n] + d[pos - n];
    } else {
      seg[lvl].sum = d[pos];
      seg[lvl].best = 0;
      seg[lvl].l = 2 * h[pos];
      seg[lvl].r = 2 * h[pos] + d[pos];
    }
    return;
  }
  seg[lvl * 2].bgn = seg[lvl].bgn;
  seg[lvl * 2].end = (seg[lvl].bgn + seg[lvl].end) / 2;
  seg[lvl * 2 + 1].bgn = (seg[lvl].bgn + seg[lvl].end) / 2 + 1;
  seg[lvl * 2 + 1].end = seg[lvl].end;
  make(lvl * 2), make(lvl * 2 + 1);
  merge(seg[lvl], seg[lvl * 2], seg[lvl * 2 + 1]);
}
node ask(int lvl, int b, int e) {
  if (b > seg[lvl].end || e < seg[lvl].bgn) return zero;
  if (b <= seg[lvl].bgn && seg[lvl].end <= e) return seg[lvl];
  node tem;
  merge(tem, ask(lvl * 2, b, e), ask(lvl * 2 + 1, b, e));
  return tem;
}
int main() {
  zero.best = 0;
  zero.l = -100000000;
  zero.r = -100000000;
  zero.sum = 0;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%I64d", &d[i]);
  for (int i = 1; i <= n; i++) scanf("%I64d", &h[i]);
  seg[1].bgn = 1;
  seg[1].end = 2 * n;
  make(1);
  for (int i = 1, a, b; i <= m; i++) {
    scanf("%d %d", &a, &b);
    if (a > b) {
      printf("%I64d\n", ask(1, b + 1, a - 1).best);
    } else {
      printf("%I64d\n", ask(1, b + 1, a - 1 + n).best);
    }
  }
}
