#include <bits/stdc++.h>
using namespace std;
const int maxn = 2 * 100100;
long long arr[maxn], n, q;
long long d[maxn];
long long l[maxn], r[maxn];
struct node {
 public:
  long long l, r;
  long long answ;
};
node tree[4 * maxn];
node mergef(node a, node b) {
  node c;
  c.l = max(a.l, b.l);
  c.r = max(a.r, b.r);
  c.answ = max(max(a.answ, b.answ), (a.l + b.r));
  return c;
}
void build(int li = 1, int ri = 2 * n, int index = 1) {
  if (li == ri) {
    tree[index].l = l[li];
    tree[index].r = r[li];
    tree[index].answ = 0LL;
  } else {
    int mid = (li + ri) / 2;
    build(li, mid, 2 * index);
    build(mid + 1, ri, 2 * index + 1);
    tree[index] = mergef(tree[2 * index], tree[2 * index + 1]);
  }
}
node query(int ql, int qr, int li = 1, int ri = 2 * n, int index = 1) {
  if (li > qr || ri < ql)
    return {-(1LL << 50), -(1LL << 50), 0};
  else if (li >= ql && ri <= qr)
    return tree[index];
  else {
    int mid = (li + ri) / 2;
    return mergef(query(ql, qr, li, mid, 2 * index),
                  query(ql, qr, mid + 1, ri, 2 * index + 1));
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> q;
  for (int i = 1; i <= n; i++) {
    cin >> d[i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> arr[i];
  }
  for (int i = n + 1; i <= 2 * n; i++) {
    arr[i] = arr[i - n];
    d[i] = d[i - n];
  }
  long long sum = 0LL;
  for (int i = 1; i <= 2 * n; i++) {
    l[i] = 2 * arr[i] - sum;
    r[i] = 2 * arr[i] + sum;
    sum += d[i];
  }
  build();
  int li, ri;
  while (q--) {
    cin >> li >> ri;
    if (li > ri) {
      swap(li, ri);
      node x = query(li + 1, ri - 1);
      cout << x.answ << "\n";
    } else {
      int ql = ri + 1;
      int qr = li + n - 1;
      node x = query(ql, qr);
      cout << x.answ << "\n";
    }
  }
  return 0;
}
