#include <bits/stdc++.h>
int dr[] = {2, 2, -2, -2, 1, -1, 1, -1};
int dc[] = {1, -1, 1, -1, 2, 2, -2, -2};
int dr1[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dc1[] = {1, -1, 1, 0, -1, 0, 1, -1};
int dr2[] = {0, 0, 1, -1};
int dc2[] = {1, -1, 0, 0};
using namespace std;
long long int a[100005], b1[100005], c[100005];
struct data {
  long long int s, le, ri;
};
data tree[100005 * 3];
long long int cal(long long int x, long long int y) {
  long long int s = 0;
  return c[y - 1] - c[x - 1];
  for (long long int i = x; i < y; i++) s += b1[i];
  return s;
}
data merg(data p, data q, long long int b, long long int e) {
  long long int mid = (b + e) >> 1;
  data r;
  r.le = max(p.le, q.le);
  r.ri = max(p.ri, q.ri);
  r.s = max(p.s, q.s);
  long long int p1 = q.le + cal(b, mid + 1);
  r.le = max(r.le, p1);
  p1 = p.ri + cal(mid, e);
  r.ri = max(r.ri, p1);
  p1 = p.ri + q.le + b1[mid];
  r.s = max(r.s, p1);
  return r;
}
void build(long long int n, long long int b, long long int e) {
  if (b == e) {
    tree[n].s = 2 * a[b];
    tree[n].le = 2 * a[b];
    tree[n].ri = 2 * a[b];
    return;
  }
  long long int mid = (b + e) >> 1, l = n * 2, r = l + 1;
  build(l, b, mid);
  build(r, mid + 1, e);
  tree[n] = merg(tree[l], tree[r], b, e);
}
data query(long long int n, long long int b, long long int e, long long int x,
           long long int y) {
  if (b > y || e < x)
    return {-2000000000000000000, -2000000000000000000, -2000000000000000000};
  if (b >= x && e <= y) {
    return tree[n];
  }
  long long int mid = (b + e) >> 1, l = n * 2, r = l + 1;
  data p1, p2, p3;
  p2 = query(l, b, mid, x, y);
  p3 = query(r, mid + 1, e, x, y);
  return merg(p2, p3, b, e);
}
long long int lef[100005], rig[100005];
int main() {
  long long int n, q, i, j;
  while (cin >> n >> q) {
    for (i = 1; i <= n; i++) {
      cin >> b1[i];
      c[i] = c[i - 1] + b1[i];
    }
    for (i = 1; i <= n; i++) cin >> a[i];
    lef[1] = a[1] * 2;
    long long int s = 0;
    for (i = 2; i <= n; i++) {
      s += b1[i - 1];
      long long int p = a[i] * 2 + s;
      lef[i] = max(lef[i - 1], p);
    }
    s = 0;
    for (i = n; i >= 1; i--) {
      s += b1[i];
      long long int p = a[i] * 2 + s;
      rig[i] = max(rig[i + 1], p);
    }
    build(1, 1, n);
    while (q--) {
      long long int x, y;
      cin >> x >> y;
      if (x > y) {
        swap(x, y);
        long long int ans = query(1, 1, n, x + 1, y - 1).s;
        cout << ans << endl;
      } else {
        long long int p = query(1, 1, n, 1, x - 1).s;
        long long int p1 = query(1, 1, n, y + 1, n).s;
        long long int p3 = -2000000000000000000;
        if (x - 1 >= 1 && y + 1 <= n) p3 = lef[x - 1] + rig[y + 1];
        cout << max(p, max(p1, p3)) << endl;
      }
    }
  }
  return 0;
}
