#include <bits/stdc++.h>
using namespace std;
struct str {
  long long int ans, pre, suf, dis;
};
vector<long long int> a, h;
vector<str> tree;
str make(long long int h) {
  str s;
  s.ans = s.pre = s.suf = 2ll * h;
  s.dis = 0;
  return s;
}
str combine(str c, str d, long long int mid) {
  if (c.ans == 0) return d;
  if (d.ans == 0) return c;
  str s;
  s.dis = c.dis + d.dis + a[mid];
  s.pre = max(c.pre, c.dis + a[mid] + d.pre);
  s.suf = max(d.suf, d.dis + a[mid] + c.suf);
  s.ans = max(max(c.ans, d.ans), c.suf + a[mid] + d.pre);
  return s;
}
void build(long long int idx, long long int s, long long int e) {
  if (s > e) return;
  if (s == e) {
    tree[idx] = make(h[s]);
    return;
  }
  long long int mid = s + (e - s) / 2;
  build(2 * idx, s, mid);
  build(2 * idx + 1, mid + 1, e);
  tree[idx] = combine(tree[2 * idx], tree[2 * idx + 1], mid);
  return;
}
str query(long long int idx, long long int l, long long int r, long long int s,
          long long int e) {
  if (r < s || l > e) return make(0);
  if (s >= l && e <= r) return tree[idx];
  long long int mid = s + (e - s) / 2;
  return combine(query(2 * idx, l, r, s, mid),
                 query(2 * idx + 1, l, r, mid + 1, e), mid);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long int n, q, i, l, r, g, x;
  cin >> n >> q;
  h.resize(2 * n);
  a.resize(2 * n);
  for (i = 0; i < n; i++) {
    cin >> a[i];
    a[i + n] = a[i];
  }
  for (i = 0; i < n; i++) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  tree.resize(8ll * n + 2);
  build(1, 0, 2 * n - 1);
  while (q--) {
    cin >> l >> r;
    l--;
    r--;
    if (l <= r)
      cout << (query(1, r + 1, l + n - 1, 0, 2 * n - 1).ans) << "\n";
    else
      cout << (query(1, r + 1, l - 1, 0, 2 * n - 1).ans) << "\n";
  }
  return 0;
}
