#include <bits/stdc++.h>
using namespace std;
int h[100010], d[100010];
long long tot, up[100010], down[100010], s[100010];
int n, m;
long long ub[100010][20], db[100010][20];
long long umax(int l, int r) {
  if (r <= l) return -1000000000000000LL;
  int i = 0;
  while ((1 << (i + 1)) <= r - l) i++;
  return max(ub[l][i], ub[r - (1 << i)][i]);
}
long long dmax(int l, int r) {
  if (r <= l) return -1000000000000000LL;
  int i = 0;
  while ((1 << (i + 1)) <= r - l) i++;
  return max(db[l][i], db[r - (1 << i)][i]);
}
struct tree {
  int l, r;
  long long v;
  tree *lt, *rt;
  tree(int _l, int _r) : l(_l), r(_r), v(-1000000000000000LL) {
    if (r - l <= 1) return;
    int mid = (l + r) >> 1;
    lt = new tree(l, mid);
    rt = new tree(mid, r);
    v = max(lt->v, rt->v);
    v = max(v, umax(mid, r) + dmax(l, mid));
  }
  long long query(int a, int b) {
    if (b - a < 2) return -1000000000000000LL;
    if (a <= l && r <= b) {
      return v;
    }
    long long res = -1000000000000000LL;
    int mid = (l + r) >> 1;
    long long x = -1000000000000000LL, y = -1000000000000000LL;
    if (a < mid) res = max(res, lt->query(a, b)), x = dmax(max(l, a), mid);
    if (b > mid) res = max(res, rt->query(a, b)), y = umax(mid, min(b, r));
    res = max(res, x + y);
    return res;
  }
};
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%d", d + i);
  for (int i = 0; i < n; i++) scanf("%d", h + i);
  for (int i = 0; i < n; i++) s[i + 1] = s[i] + d[i];
  for (int i = 0; i < n; i++)
    up[i] = s[i] + 2ll * h[i], down[i] = -s[i] + 2ll * h[i];
  for (int i = 0; i < n; i++) ub[i][0] = up[i], db[i][0] = down[i];
  for (int j = 1; j < 20; j++) {
    for (int x = 0; x + (1 << (j - 1)) <= n; x++) {
      ub[x][j] = max(ub[x + (1 << (j - 1))][j - 1], ub[x][j - 1]);
      db[x][j] = max(db[x + (1 << (j - 1))][j - 1], db[x][j - 1]);
    }
  }
  tree *t = new tree(0, n);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--;
    b--;
    long long res = -1000000000000000LL;
    if (a <= b) {
      res = max(t->query(0, a), t->query(b + 1, n));
      res = max(res, umax(0, a) + dmax(b + 1, n) + s[n]);
    } else {
      res = t->query(b + 1, a);
    }
    cout << res << endl;
  }
  return 0;
}
