#include <bits/stdc++.h>
using namespace std;
int d[200100], h[200100];
long long sum[200100];
long long mx[200100 << 2], lmx[200100 << 2], rmx[200100 << 2];
long long get_sum(int l, int r) { return sum[r] - sum[l - 1]; }
void up(int o, int l, int r) {
  mx[o] = max(mx[(o << 1)], mx[((o << 1) | 1)]);
  mx[o] = max(mx[o], rmx[(o << 1)] + lmx[((o << 1) | 1)] + d[((l + r) >> 1)]);
  lmx[o] = max(lmx[(o << 1)], lmx[((o << 1) | 1)] + get_sum(l, ((l + r) >> 1)));
  rmx[o] =
      max(rmx[((o << 1) | 1)], rmx[(o << 1)] + get_sum(((l + r) >> 1), r - 1));
}
void build(int o, int l, int r) {
  if (l == r) {
    mx[o] = lmx[o] = rmx[o] = h[l];
    return;
  }
  build((o << 1), l, ((l + r) >> 1));
  build(((o << 1) | 1), ((l + r) >> 1) + 1, r);
  up(o, l, r);
}
long long ans = 0;
void query(int o, int l, int r, int y1, int y2, long long& las) {
  if (y1 <= l && y2 >= r) {
    ans = max(ans, max(mx[o], las + lmx[o]));
    las = max(rmx[o] + d[r], las + get_sum(l, r));
    return;
  }
  if (y1 <= ((l + r) >> 1)) query((o << 1), l, ((l + r) >> 1), y1, y2, las);
  if (y2 > ((l + r) >> 1))
    query(((o << 1) | 1), ((l + r) >> 1) + 1, r, y1, y2, las);
}
int main() {
  int n, m;
  while (~scanf("%d%d", &n, &m)) {
    for (int i = 1; i <= n; ++i) scanf("%d", &d[i]);
    for (int i = 1; i <= n; ++i) scanf("%d", &h[i]);
    for (int i = 1; i <= n; ++i) {
      d[i + n] = d[i];
      h[i] <<= 1;
      h[i + n] = h[i];
    }
    n <<= 1;
    sum[0] = 0;
    for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + d[i];
    build(1, 1, n);
    int l, r;
    while (m--) {
      scanf("%d%d", &l, &r);
      if (l <= r) {
        swap(l, r);
        l++;
        r += n / 2 - 1;
      } else {
        swap(l, r);
        l++;
        r--;
      }
      ans = 0;
      long long las = 0;
      query(1, 1, n, l, r, las);
      printf("%lld\n", ans);
    }
  }
  return 0;
}
