#include <bits/stdc++.h>
using namespace std;
struct seg {
  long long mx, l, r, dist;
  seg() {}
  seg(long long mx, long long l, long long r, long long dist)
      : mx(mx), l(l), r(r), dist(dist) {}
};
seg operator+(seg l, seg r) {
  long long mx = max(l.mx, r.mx);
  mx = max(mx, l.r + r.l);
  long long ll = max(l.l, r.l + l.dist);
  long long rr = max(r.r, l.r + r.dist);
  long long dist = l.dist + r.dist;
  return seg(mx, ll, rr, dist);
}
int n, m;
long long d[100010], h[100010];
seg s[4 * 100010];
void build(int i, int l, int r) {
  if (l == r) {
    long long mx = 0;
    long long ll = 2 * h[l];
    long long rr = 2 * h[r] + d[r];
    long long dist = d[r];
    s[i] = seg(mx, ll, rr, dist);
    return;
  }
  int mid = (l + r) / 2;
  build(2 * i, l, mid);
  build(2 * i + 1, mid + 1, r);
  s[i] = s[2 * i] + s[2 * i + 1];
}
seg query(int i, int l, int r, int ll, int rr) {
  if (r < ll || l > rr) return seg();
  if (l >= ll && r <= rr) return s[i];
  int mid = (l + r) / 2;
  seg sl = query(2 * i, l, mid, ll, rr);
  seg sr = query(2 * i + 1, mid + 1, r, ll, rr);
  if (mid < ll) return sr;
  if (mid >= rr) return sl;
  return sl + sr;
}
seg query(int ll, int rr) { return query(1, 1, n, ll, rr); }
long long solve(int a, int b) {
  if (a > b) return query(b + 1, a - 1).mx;
  if (a == 1) return query(b + 1, n).mx;
  if (b == n) return query(1, a - 1).mx;
  seg s1 = query(1, a - 1);
  seg s2 = query(b + 1, n);
  seg res = s2 + s1;
  return res.mx;
}
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> d[i];
  for (int i = 1; i <= n; i++) cin >> h[i];
  build(1, 1, n);
  while (m--) {
    int a, b;
    cin >> a >> b;
    cout << solve(a, b) << '\n';
  }
}
