#include <bits/stdc++.h>
using namespace std;
const int N = 6e5 + 10;
const long long inf = -(1LL << 60);
const long long MOD = 998244353;
int n, m;
int in[N << 2][2];
long long tree[N << 2][2];
long long d[N], h[N], sum[N];
void pushup(int o) {
  if (tree[2 * o][0] >= tree[2 * o + 1][0]) {
    tree[o][0] = tree[2 * o][0];
    in[o][0] = in[2 * o][0];
  } else {
    tree[o][0] = tree[2 * o + 1][0];
    in[o][0] = in[2 * o + 1][0];
  }
  if (tree[2 * o][1] >= tree[2 * o + 1][1]) {
    tree[o][1] = tree[2 * o][1];
    in[o][1] = in[2 * o][1];
  } else {
    tree[o][1] = tree[2 * o + 1][1];
    in[o][1] = in[2 * o + 1][1];
  }
}
void build(int o, int L, int R) {
  if (L == R) {
    in[o][0] = in[o][1] = L;
    tree[o][0] = 2 * h[L] - sum[L - 1];
    tree[o][1] = 2 * h[L] + sum[L - 1];
    return;
  }
  int mid = L + (R - L) / 2;
  build(2 * o, L, mid);
  build(2 * o + 1, mid + 1, R);
  pushup(o);
}
int query(int o, int L, int R, int x, int y, int index) {
  int ans1 = -1, ans2 = -1;
  if (x <= L && R <= y) return in[o][index];
  int mid = L + (R - L) / 2;
  if (x <= mid) ans1 = query(2 * o, L, mid, x, y, index);
  if (mid < y) ans2 = query(2 * o + 1, mid + 1, R, x, y, index);
  if (ans1 == -1) return ans2;
  if (ans2 == -1) return ans1;
  if (index == 0) {
    if (2 * h[ans1] - sum[ans1 - 1] >= 2 * h[ans2] - sum[ans2 - 1])
      return ans1;
    else
      return ans2;
  } else {
    if (2 * h[ans1] + sum[ans1 - 1] >= 2 * h[ans2] + sum[ans2 - 1])
      return ans1;
    else
      return ans2;
  }
}
long long getans(int x, int y, int f) {
  long long ans;
  int in1, in2 = -1, in3 = -1;
  in1 = query(1, 1, 2 * n, x, y, f);
  if (in1 - 1 >= x) in2 = query(1, 1, 2 * n, x, in1 - 1, f ^ 1);
  if (y >= in1 + 1) in3 = query(1, 1, 2 * n, in1 + 1, y, f ^ 1);
  if (f == 0) {
    if (in2 != -1 && in3 != -1)
      ans = max(2 * h[in2] + sum[in2 - 1], 2 * h[in3] + sum[in3 - 1]);
    else if (in2 != -1)
      ans = 2 * h[in2] + sum[in2 - 1];
    else if (in3 != -1)
      ans = 2 * h[in3] + sum[in3 - 1];
    return ans + 2 * h[in1] - sum[in1 - 1];
  } else {
    if (in2 != -1 && in3 != -1)
      ans = max(2 * h[in2] - sum[in2 - 1], 2 * h[in3] - sum[in3 - 1]);
    else if (in2 != -1)
      ans = 2 * h[in2] - sum[in2 - 1];
    else if (in3 != -1)
      ans = 2 * h[in3] - sum[in3 - 1];
    return ans + 2 * h[in1] + sum[in1 - 1];
  }
}
int main() {
  sum[0] = 0;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    cin >> d[i];
    d[i + n] = d[i];
  }
  for (int i = 1; i <= 2 * n; i++) sum[i] = sum[i - 1] + d[i];
  for (int i = 1; i <= n; i++) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  build(1, 1, 2 * n);
  while (m--) {
    int a, b, x, y;
    scanf("%d%d", &a, &b);
    if (a <= b) {
      x = b + 1;
      y = a + n - 1;
    }
    if (a > b) {
      x = b + 1;
      y = a - 1;
    }
    long long ans1 = getans(x, y, 0);
    long long ans2 = getans(x, y, 1);
    cout << max(ans1, ans2) << endl;
  }
}
