#include <bits/stdc++.h>
using namespace std;
struct segtree {
  long long left, right, ans;
};
long long h[200010], d[200010], arr[200010], brr[200010];
segtree tree[2000100];
segtree merge(segtree x, segtree y) {
  segtree temp;
  temp.ans = max(x.ans, y.ans);
  temp.ans = max(x.left + y.right, temp.ans);
  temp.left = max(x.left, y.left);
  temp.right = max(x.right, y.right);
  return temp;
}
void build(int curr, int x, int y) {
  if (x == y) {
    tree[curr].left = arr[x];
    tree[curr].right = brr[x];
    tree[curr].ans = -1000000000000;
    return;
  }
  int mid = (x + y) >> 1;
  build(2 * curr, x, mid);
  build(2 * curr + 1, mid + 1, y);
  tree[curr] = merge(tree[2 * curr], tree[2 * curr + 1]);
}
segtree query(int curr, int x, int y, int qx, int qy) {
  if (qx <= x && qy >= y) return tree[curr];
  int mid = (x + y) >> 1;
  if (qx > mid)
    return query(2 * curr + 1, mid + 1, y, qx, qy);
  else if (qy <= mid)
    return query(2 * curr, x, mid, qx, qy);
  else {
    segtree temp1 = query(2 * curr, x, mid, qx, qy);
    segtree temp2 = query(2 * curr + 1, mid + 1, y, qx, qy);
    return merge(temp1, temp2);
  }
}
void solve() {
  int n, m, x, y, i;
  long long temp = 0;
  scanf("%d", &n);
  scanf("%d", &m);
  for (i = 1; i <= n; i++) {
    scanf("%I64d", &d[i]);
    d[i + n] = d[i];
  }
  for (i = 1; i <= n; i++) {
    scanf("%I64d", &h[i]);
    h[i + n] = h[i];
  }
  for (i = 1; i <= 2 * n; i++) {
    brr[i] = temp + 2 * h[i];
    arr[i] = 2 * h[i] - temp;
    temp += d[i];
  }
  segtree temp1;
  build(1, 1, 2 * n);
  for (i = 0; i < m; i++) {
    scanf("%d", &x);
    scanf("%d", &y);
    if (y >= x)
      temp1 = query(1, 1, 2 * n, y + 1, x + n - 1);
    else
      temp1 = query(1, 1, 2 * n, y + 1, x - 1);
    printf("%I64d\n", temp1.ans);
  }
}
int main() {
  solve();
  return 0;
}
