#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n, m;
long long d[maxn];
int h[maxn];
struct node {
  long long x[3];
} tr[maxn << 3];
node operator+(const node &a, const node &b) {
  return (node){max(max(a.x[0], b.x[0]), a.x[1] + b.x[2]), max(a.x[1], b.x[1]),
                max(a.x[2], b.x[2])};
}
void build(int o, int l, int r) {
  if (l == r) {
    if (r <= n) {
      tr[o].x[0] = 0;
      tr[o].x[1] = h[r] * 2 - d[r - 1];
      tr[o].x[2] = h[r] * 2 + d[r - 1];
    } else {
      r -= n;
      tr[o].x[0] = 0;
      tr[o].x[1] = h[r] * 2 - d[r - 1] - d[n];
      tr[o].x[2] = h[r] * 2 + d[r - 1] + d[n];
    }
    return;
  }
  int mid = l + r >> 1;
  build(o << 1, l, mid);
  build(o << 1 | 1, mid + 1, r);
  tr[o] = tr[o << 1] + tr[o << 1 | 1];
}
node ask(int o, int l, int r, int s, int t) {
  if (s <= l && r <= t) return tr[o];
  int mid = l + r >> 1;
  if (t <= mid)
    return ask(o << 1, l, mid, s, t);
  else if (s > mid)
    return ask(o << 1 | 1, mid + 1, r, s, t);
  return ask(o << 1, l, mid, s, t) + ask(o << 1 | 1, mid + 1, r, s, t);
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> d[i], d[i] += d[i - 1];
  for (int i = 1; i <= n; i++) cin >> h[i];
  build(1, 1, n * 2);
  for (int l, r; m--;) {
    cin >> l >> r;
    if (l > r) r += n;
    cout << ask(1, 1, n * 2, r + 1, l + n - 1).x[0] << '\n';
  }
  return 0;
}
