#include <bits/stdc++.h>
using namespace std;
int const lim = 100000;
struct node {
  long long mx;
  int index;
};
node st[8 * lim], stt[8 * lim];
long long inp[2 * lim + 10], L[2 * lim + 3], R[2 * lim + 3], h[lim * 2 + 10];
void build(int i, int j, int index) {
  if (i == j) {
    st[index].mx = R[i], st[index].index = i;
    return;
  }
  int mid = (i + j) / 2;
  build(i, mid, index * 2 + 1);
  build(mid + 1, j, index * 2 + 2);
  if (st[index * 2 + 1].mx > st[index * 2 + 2].mx) {
    st[index].mx = st[index * 2 + 1].mx;
    st[index].index = st[index * 2 + 1].index;
  } else {
    st[index].mx = st[index * 2 + 2].mx;
    st[index].index = st[index * 2 + 2].index;
  }
}
void buildd(int i, int j, int index) {
  if (i == j) {
    stt[index].mx = L[i], stt[index].index = i;
    return;
  }
  int mid = (i + j) / 2;
  buildd(i, mid, index * 2 + 1);
  buildd(mid + 1, j, index * 2 + 2);
  if (stt[index * 2 + 1].mx > stt[index * 2 + 2].mx) {
    stt[index].mx = stt[index * 2 + 1].mx;
    stt[index].index = stt[index * 2 + 1].index;
  } else {
    stt[index].mx = stt[index * 2 + 2].mx;
    stt[index].index = stt[index * 2 + 2].index;
  }
}
node RMQ(int i, int j, int index, int l, int r) {
  node n;
  n.mx = -LONG_LONG_MAX;
  if (r < i || l > j) return n;
  if (i >= l && j <= r) return st[index];
  int mid = (i + j) / 2;
  node v1 = RMQ(i, mid, index * 2 + 1, l, r);
  node v2 = RMQ(mid + 1, j, index * 2 + 2, l, r);
  if (v1.mx > v2.mx)
    n.mx = v1.mx, n.index = v1.index;
  else
    n.mx = v2.mx, n.index = v2.index;
  return n;
}
node RMQQ(int i, int j, int index, int l, int r) {
  node n;
  n.mx = -LONG_LONG_MAX;
  if (r < i || l > j) return n;
  if (i >= l && j <= r) return stt[index];
  int mid = (i + j) / 2;
  node v1 = RMQQ(i, mid, index * 2 + 1, l, r);
  node v2 = RMQQ(mid + 1, j, index * 2 + 2, l, r);
  if (v1.mx > v2.mx)
    n.mx = v1.mx, n.index = v1.index;
  else
    n.mx = v2.mx, n.index = v2.index;
  return n;
}
int main() {
  int n, q;
  cin >> n >> q;
  for (int i = 0; i < n; i++) cin >> inp[i];
  for (int i = n; i < 2 * n; i++) inp[i] = inp[i - n];
  for (int i = 0; i < n; i++) cin >> h[i];
  for (int i = n; i < 2 * n; i++) h[i] = h[i - n];
  long long con = 0;
  for (int i = 0; i < 2 * n; i++)
    L[i] = 2 * h[i] - con, R[i] = 2 * h[i] + con, con += inp[i];
  build(0, 2 * n, 0);
  buildd(0, 2 * n, 0);
  while (q--) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    if (x <= y) {
      node u = RMQ(0, 2 * n, 0, y + 1, n + x - 1);
      long long val = u.mx;
      node v = RMQQ(0, 2 * n, 0, y + 1, u.index - 1);
      u = RMQQ(0, 2 * n, 0, u.index + 1, n + x - 1);
      long long ans1 = val + max(u.mx, v.mx);
      u = RMQQ(0, 2 * n, 0, y + 1, n + x - 1);
      val = u.mx;
      v = RMQ(0, 2 * n, 0, y + 1, u.index - 1);
      u = RMQ(0, 2 * n, 0, u.index + 1, n + x - 1);
      long long ans2 = val + max(u.mx, v.mx);
      cout << max(ans1, ans2) << endl;
    } else {
      node u = RMQ(0, 2 * n, 0, y + 1, x - 1);
      long long val = u.mx;
      node v = RMQQ(0, 2 * n, 0, y + 1, u.index - 1);
      u = RMQQ(0, 2 * n, 0, u.index + 1, x - 1);
      long long ans1 = val + max(u.mx, v.mx);
      u = RMQQ(0, 2 * n, 0, y + 1, x - 1);
      val = u.mx;
      v = RMQ(0, 2 * n, 0, y + 1, u.index - 1);
      u = RMQ(0, 2 * n, 0, u.index + 1, x - 1);
      long long ans2 = val + max(u.mx, v.mx);
      cout << max(ans1, ans2) << endl;
    }
  }
}
