#include <bits/stdc++.h>
using namespace std;
const int maxn = 100050 * 2;
long long high[maxn];
long long d[maxn];
int ql;
int qr;
struct node {
  long long maxval[4 * maxn], left[4 * maxn], right[4 * maxn], dis[4 * maxn];
  void build(int i, int l, int r) {
    if (l == r) {
      left[i] = 2 * high[l] + d[l];
      right[i] = 2 * high[l];
      maxval[i] = 0;
      dis[i] = d[l];
    } else {
      int mid = (l + r) / 2;
      int lc = i * 2;
      int rc = i * 2 + 1;
      build(lc, l, mid);
      build(rc, mid + 1, r);
      maxval[i] = max(left[lc] + right[rc], max(maxval[lc], maxval[rc]));
      left[i] = max(left[lc] + dis[rc], left[rc]);
      right[i] = max(right[rc] + dis[lc], right[lc]);
      dis[i] = dis[lc] + dis[rc];
    }
  }
  long long query(int i, int l, int r, long long &ansl, long long &ansr,
                  long long &juli) {
    if (l >= ql && qr >= r) {
      ansl = left[i];
      ansr = right[i];
      juli = dis[i];
      return maxval[i];
    } else {
      int mid = l + (r - l) / 2;
      if (ql > mid) return query(i * 2 + 1, mid + 1, r, ansl, ansr, juli);
      if (qr <= mid) return query(i * 2, l, mid, ansl, ansr, juli);
      long long l1, r1, j1, l2, r2, j2, tep;
      tep = max(query(i * 2, l, mid, l1, r1, j1),
                query((i * 2) + 1, mid + 1, r, l2, r2, j2));
      tep = max(tep, l1 + r2);
      ansl = max(l1 + j2, l2);
      ansr = max(r2 + j1, r1);
      juli = j1 + j2;
      return tep;
    }
  }
} tree;
int main() {
  int n, m, i;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%lld", &d[i]);
  for (i = 1; i <= n; i++) scanf("%lld", &high[i]);
  for (i = n + 1; i <= 2 * n; i++) {
    d[i] = d[i - n];
    high[i] = high[i - n];
  }
  tree.build(1, 1, 2 * n);
  for (i = 1; i <= m; i++) {
    int a, b;
    long long l1 = 0, r1 = 0, j1 = 0;
    scanf("%d%d", &a, &b);
    if (a <= b)
      ql = b + 1, qr = a + n - 1;
    else
      ql = b + 1, qr = a - 1;
    long long ans = tree.query(1, 1, 2 * n, l1, r1, j1);
    printf("%lld\n", ans);
  }
}
