#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
double eps = 1e-10;
using namespace std;
int n, m;
long long pref[2][200005], d[200005], h[200005], sum[200005];
pair<pair<long long, int>, pair<long long, int> > t[2][800005];
pair<pair<long long, int>, pair<long long, int> > Merge(
    pair<pair<long long, int>, pair<long long, int> > a,
    pair<pair<long long, int>, pair<long long, int> > b) {
  pair<pair<long long, int>, pair<long long, int> > res;
  long long first_max = -200000000000000000LL, idx_first = 0,
            second_max = -200000000000000000LL, idx_second = 0;
  if (a.first.first > b.first.first) {
    first_max = a.first.first, idx_first = a.first.second;
  } else {
    first_max = b.first.first, idx_first = b.first.second;
  }
  if (a.first.first > second_max && a.first.second != idx_first) {
    second_max = a.first.first, idx_second = a.first.second;
  }
  if (a.second.first > second_max && a.second.second != idx_first) {
    second_max = a.second.first, idx_second = a.second.second;
  }
  if (b.first.first > second_max && b.first.second != idx_first) {
    second_max = b.first.first, idx_second = b.first.second;
  }
  if (b.second.first > second_max && b.second.second != idx_first) {
    second_max = b.second.first, idx_second = b.second.second;
  }
  res = {{first_max, idx_first}, {second_max, idx_second}};
  return res;
}
void build(int idx, int v, int tl, int tr) {
  if (tl == tr) {
    t[idx][v] = {{pref[idx][tl], tl}, {-200000000000000000LL, 0}};
  } else {
    int tm = (tl + tr) / 2;
    build(idx, v * 2, tl, tm);
    build(idx, v * 2 + 1, tm + 1, tr);
    t[idx][v] = Merge(t[idx][v * 2], t[idx][v * 2 + 1]);
  }
}
pair<pair<long long, int>, pair<long long, int> > get_max(int idx, int v,
                                                          int tl, int tr, int l,
                                                          int r) {
  if (l > r) return {{-200000000000000000LL, 0}, {-200000000000000000LL, 0}};
  if (l == tl && r == tr) return t[idx][v];
  int tm = (tl + tr) / 2;
  return Merge(get_max(idx, v * 2, tl, tm, l, min(r, tm)),
               get_max(idx, v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", d + i);
    d[n + i] = d[i];
  }
  for (int i = 1; i <= n; i++) {
    scanf("%I64d", h + i);
    h[n + i] = h[i];
  }
  for (int i = 1; i <= 2 * n; i++) sum[i] = sum[i - 1] + d[i];
  for (int i = 1; i <= 2 * n; i++) {
    pref[0][i] = sum[i - 1] + 2LL * h[i];
    pref[1][i] = 2LL * h[i] - sum[i - 1];
  }
  build(0, 1, 1, 2 * n);
  build(1, 1, 1, 2 * n);
  for (int i = 1; i <= m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    int l = b + 1, r = n + a - 1;
    if (a > b) {
      l = b + 1;
      r = a - 1;
    }
    pair<pair<long long, int>, pair<long long, int> > res0 =
        get_max(0, 1, 1, 2 * n, l, r);
    pair<pair<long long, int>, pair<long long, int> > res1 =
        get_max(1, 1, 1, 2 * n, l, r);
    long long ans = 0;
    if (res0.first.second != res1.first.second) {
      ans = (ans > res0.first.first + res1.first.first
                 ? ans
                 : res0.first.first + res1.first.first);
    }
    if (res0.first.second != res1.second.second) {
      ans = (ans > res0.first.first + res1.second.first
                 ? ans
                 : res0.first.first + res1.second.first);
    }
    if (res0.second.second != res1.first.second) {
      ans = (ans > res0.second.first + res1.first.first
                 ? ans
                 : res0.second.first + res1.first.first);
    }
    if (res0.second.second != res1.second.second) {
      ans = (ans > res0.second.first + res1.second.first
                 ? ans
                 : res0.second.first + res1.second.first);
    }
    printf("%I64d\n", ans);
  }
}
