#include <bits/stdc++.h>
using namespace std;
long long int d[100005], h[100005];
struct node {
  long long int val;
  long long int maxl;
  long long int maxr;
  long long int dis;
} t[4 * 100005];
void build(int node, int i, int j) {
  if (i == j) {
    t[node].val = 0;
    t[node].maxl = 2 * h[i];
    t[node].maxr = 2 * h[i];
    t[node].dis = 0;
    return;
  }
  int mid;
  mid = (i + j) / 2;
  build(2 * node, i, mid);
  build(2 * node + 1, mid + 1, j);
  t[node].val = max(t[2 * node].val, t[2 * node + 1].val);
  t[node].val =
      max(t[node].val, t[2 * node].maxr + t[2 * node + 1].maxl + d[mid]);
  t[node].dis = t[2 * node].dis + t[2 * node + 1].dis + d[mid];
  t[node].maxl =
      max(t[2 * node].maxl, t[2 * node].dis + d[mid] + t[2 * node + 1].maxl);
  t[node].maxr = max(t[2 * node + 1].maxr,
                     t[2 * node + 1].dis + d[mid] + t[2 * node].maxr);
  return;
}
struct node query(int node, int i, int j, int a, int b) {
  if (i >= a && j <= b) return t[node];
  int mid;
  struct node p1, p2, p3;
  mid = (i + j) / 2;
  if (b <= mid)
    return query(2 * node, i, mid, a, b);
  else if (a > mid)
    return query(2 * node + 1, mid + 1, j, a, b);
  else {
    p1 = query(2 * node, i, mid, a, mid);
    p2 = query(2 * node + 1, mid + 1, j, mid + 1, b);
    p3.val = max(p1.val, p2.val);
    p3.val = max(p3.val, p1.maxr + p2.maxl + d[mid]);
    p3.dis = p1.dis + p2.dis + d[mid];
    p3.maxl = max(p1.maxl, p1.dis + p2.maxl + d[mid]);
    p3.maxr = max(p2.maxr, p2.dis + p1.maxr + d[mid]);
    return p3;
  }
}
int main() {
  int n, m, i, j, l, r;
  struct node p1, p2, p3;
  cin >> n >> m;
  for (i = 0; i < n; i++) cin >> d[i];
  for (i = 0; i < n; i++) cin >> h[i];
  build(1, 0, n - 1);
  while (m--) {
    cin >> l >> r;
    l--;
    r--;
    p1.val = -1;
    p2.val = -1;
    if (l <= r) {
      if (r + 1 <= n - 1) p1 = query(1, 0, n - 1, r + 1, n - 1);
      if (l - 1 >= 0) p2 = query(1, 0, n - 1, 0, l - 1);
      if (p1.val == -1)
        cout << p2.val << endl;
      else if (p2.val == -1)
        cout << p1.val << endl;
      else {
        p3.val = max(p1.val, p2.val);
        p3.val = max(p3.val, p1.maxr + p2.maxl + d[n - 1]);
        cout << p3.val << endl;
      }
    } else {
      p3 = query(1, 0, n - 1, r + 1, l - 1);
      cout << p3.val << endl;
    }
  }
  return 0;
}
