#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream ss(s);
  string first;
  while (getline(ss, first, c)) v.emplace_back(first);
  return move(v);
}
void err(vector<string>::iterator it) {}
template <typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {
  cerr << a << " ";
  err(++it, args...);
}
const long long M = 500010, mod = 1000000007;
long long dist[M], height[M];
struct data {
  long long relv;
  long long l, r;
  long long maxx, lmax, rmax;
  data(){};
  data(long long a, long long b, long long c, long long d, long long e,
       long long f)
      : relv(a), l(b), r(c), maxx(d), lmax(e), rmax(f) {}
};
data operator+(data a, data b) {
  if (a.relv && !b.relv)
    return a;
  else if (!a.relv && b.relv)
    return b;
  else {
    data c;
    long long asz = dist[a.r - 1] - dist[a.l - 1],
              bsz = dist[b.r - 1] - dist[b.l - 1],
              d = dist[b.l - 1] - dist[a.r - 1];
    c.relv = true;
    c.l = a.l;
    c.r = b.r;
    c.maxx = max(max(a.maxx, b.maxx), a.rmax + b.lmax + d);
    c.lmax = max(a.lmax, b.lmax + asz + d);
    c.rmax = max(b.rmax, a.rmax + bsz + d);
    return c;
  }
}
data T[M];
void build(long long i, long long l, long long r) {
  if (l == r)
    T[i] = data(1, l, r, 0, height[l], height[r]);
  else {
    long long m = (l + r) / 2;
    build(2 * i, l, m);
    build(2 * i + 1, m + 1, r);
    T[i] = T[2 * i] + T[2 * i + 1];
  }
}
data query(long long i, long long l, long long r, long long st, long long ed) {
  if (l >= st && r <= ed)
    return T[i];
  else if (l > ed || r < st)
    return data(0, l, r, 0, 0, 0);
  else {
    long long m = (l + r) / 2;
    data L = query(2 * i, l, m, st, ed), R = query(2 * i + 1, m + 1, r, st, ed);
    return L + R;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  long long n, q, i, j, k, l, r, temp;
  scanf("%I64d%I64d", &n, &q);
  for (i = 1; i <= n; i++) scanf("%I64d", &dist[i]);
  for (i = 1; i <= n; i++) scanf("%I64d", &height[i]), height[i] *= 2;
  for (i = n + 1, j = 1; j <= n; i++, j++)
    height[i] = height[j], dist[i] = dist[j];
  n *= 2;
  for (i = 2; i <= n; i++) dist[i] += dist[i - 1];
  build(1, 1, n);
  while (q--) {
    scanf("%I64d%I64d", &l, &r);
    if (l <= r)
      temp = l, l = r + 1, r = temp + n / 2 - 1;
    else
      swap(l, r), l++, r--;
    data c = query(1, 1, n, l, r);
    printf("%I64d\n", c.maxx);
  }
  return 0;
}
