#include <bits/stdc++.h>
using namespace std;
struct node {
  long long int left_best, right_best, best_sum;
  node() {
    left_best = 0;
    right_best = 0;
    best_sum = 0;
  }
};
int N, M, H[200005], A, B;
node st[4 * 200005];
long long int D[200005];
void _merge(node &a, node &b, node &c) {
  c.best_sum = max(a.best_sum, b.best_sum);
  c.best_sum = max(c.best_sum, a.left_best + b.right_best);
  c.left_best = max(a.left_best, b.left_best);
  c.right_best = max(a.right_best, b.right_best);
}
void buildst(int idx, int ss, int se) {
  if (ss == se) {
    st[idx].left_best = H[ss] - D[ss];
    st[idx].right_best = H[ss] + D[ss];
    st[idx].best_sum = 0;
    return;
  }
  int mid = (ss + se) / 2;
  buildst(2 * idx, ss, mid);
  buildst(2 * idx + 1, mid + 1, se);
  _merge(st[2 * idx], st[2 * idx + 1], st[idx]);
}
node query(int idx, int ss, int se, int L, int R) {
  node ret;
  if (L > se || R < ss) {
    ret.left_best = -100000000000000000LL;
    ret.right_best = -100000000000000000LL;
    ret.best_sum = 0;
    return ret;
  }
  if (L <= ss && se <= R) {
    return st[idx];
  }
  int mid = (ss + se) / 2;
  node left = query(2 * idx, ss, mid, L, R);
  node right = query(2 * idx + 1, mid + 1, se, L, R);
  _merge(left, right, ret);
  return ret;
}
int main() {
  scanf("%d", &N);
  scanf("%d", &M);
  for (int i = 1; i <= N; i++) {
    scanf("%lld", &D[i]);
    D[N + i] = D[i];
  }
  for (int i = 1; i <= N; i++) {
    scanf("%d", &H[i]);
    H[i] += H[i];
    H[N + i] = H[i];
  }
  for (int i = 1; i <= 2 * N; i++) D[i] += D[i - 1];
  for (int i = 2 * N - 1; i >= 1; i--) {
    D[i + 1] = D[i];
  }
  D[1] = 0;
  buildst(1, 1, 2 * N);
  while (M--) {
    scanf("%d", &A);
    scanf("%d", &B);
    if (A <= B) {
      B++;
      A--;
      A += N;
    } else {
      B++;
      A--;
    }
    assert(B <= A);
    printf("%lld\n", query(1, 1, 2 * N, B, A).best_sum);
  }
  return 0;
}
