#include <bits/stdc++.h>
using namespace std;
const int DIM = 200005;
struct Node {
  long long mxm, lef, rig, sum;
  Node(long long _mxm = 0, long long _lef = 0, long long _rig = 0,
       long long _sum = 0)
      : mxm(_mxm), lef(_lef), rig(_rig), sum(_sum) {}
};
Node sgt[DIM << 2];
long long hgt[DIM], len[DIM];
Node combine(Node n1, Node n2) {
  return Node(max(n1.lef + n2.rig, max(n1.mxm, n2.mxm)),
              max(n2.lef, n1.lef + n2.sum), max(n1.rig, n2.rig + n1.sum),
              n1.sum + n2.sum);
}
void build(int nd, int le, int ri) {
  if (le == ri)
    sgt[nd] = Node(0, len[le] + hgt[le] * 2, hgt[le] * 2, len[le]);
  else {
    int md = (le + ri) >> 1;
    build(nd << 1, le, md);
    build(nd << 1 | 1, md + 1, ri);
    sgt[nd] = combine(sgt[nd << 1], sgt[nd << 1 | 1]);
  }
}
Node query(int nd, int le, int ri, int st, int en) {
  if (st == le and ri == en)
    return sgt[nd];
  else {
    int md = (le + ri) >> 1;
    if (en <= md)
      return query(nd << 1, le, md, st, en);
    else if (md < st)
      return query(nd << 1 | 1, md + 1, ri, st, en);
    else
      return combine(query(nd << 1, le, md, st, md),
                     query(nd << 1 | 1, md + 1, ri, md + 1, en));
  }
}
int main(void) {
  int n, m;
  ;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> len[i], len[i + n] = len[i];
  for (int i = 1; i <= n; ++i) cin >> hgt[i], hgt[i + n] = hgt[i];
  build(1, 1, n * 2);
  while (m--) {
    int l, r;
    cin >> l >> r;
    int st, en;
    if (l <= r)
      st = r + 1, en = l + n - 1;
    else
      st = r + 1, en = l - 1;
    cout << query(1, 1, n * 2, st, en).mxm << endl;
  }
  return 0;
}
