#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
const int P = 2e6 + 5;
long long d[N], h[N];
long long a[P];
long long sl[P], sr[P];
long long tot[P], hj;
int sz;
int cnt = 0;
struct node {
  long long ll, rr, res;
  long long tt;
  int l1, r1;
} seq[5000];
inline long long min(long long x, long long y) {
  if (x > y)
    return y;
  else
    return x;
}
inline long long max(long long x, long long y) {
  if (x < y)
    return y;
  else
    return x;
}
inline void swap(int &x, int &y) {
  int T = x;
  x = y;
  y = T;
  return;
}
void build(int l, int r, int k) {
  if (l == r) {
    sl[k] = sr[k] = a[k] = (long long)h[k - sz + 1];
    tot[k] = 0;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, k << 1);
  build(mid + 1, r, k << 1 | 1);
  tot[k] = tot[k << 1] + tot[k << 1 | 1] + d[mid];
  a[k] = sr[k << 1] + sl[k << 1 | 1] + d[mid];
  a[k] = max(a[k], max(a[k << 1], a[k << 1 | 1]));
  long long cd = 0;
  sl[k] = h[l];
  for (int i = l + 1; i <= r; i++) {
    cd += d[i - 1];
    sl[k] = max(sl[k], (long long)h[i] + cd);
  }
  cd = 0;
  sr[k] = h[r];
  for (int i = r - 1; i >= l; i--) {
    cd += d[i];
    sr[k] = max(sr[k], (long long)h[i] + cd);
  }
  return;
}
inline void add(int k, int l, int r) {
  cnt++;
  seq[cnt].ll = sl[k];
  seq[cnt].rr = sr[k];
  seq[cnt].res = a[k];
  seq[cnt].tt = tot[k];
  seq[cnt].l1 = l;
  seq[cnt].r1 = r;
  return;
}
inline void query(int l, int r, int left, int right, int k) {
  if (l == left && r == right) {
    add(k, l, r);
    return;
  }
  int mid = (left + right) >> 1;
  if (r <= mid)
    query(l, r, left, mid, k << 1);
  else if (l > mid)
    query(l, r, mid + 1, right, k << 1 | 1);
  else {
    query(l, mid, left, mid, k << 1);
    query(mid + 1, r, mid + 1, right, k << 1 | 1);
  }
  return;
}
inline long long get() {
  long long ans = 0;
  for (int i = 1; i <= cnt; i++) {
    ans = max(ans, seq[i].res);
    long long cd = seq[i].rr;
    for (int j = i + 1; j <= cnt; j++) {
      cd += (long long)d[seq[j - 1].r1];
      ans = max(ans, seq[j].ll + cd);
      cd += seq[j].tt;
    }
  }
  return ans;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  n <<= 1;
  hj = (n >> 1);
  int x, y;
  for (int i = 1; i <= n >> 1; i++) {
    scanf("%d", &x);
    d[i] = x;
    d[i + hj] = d[i];
  }
  for (int i = 1; i <= n >> 1; i++) {
    scanf("%d", &x);
    h[i] = x;
    h[i] <<= 1;
    h[i + hj] = h[i];
  }
  sz = 1;
  while (sz < n) sz <<= 1;
  build(1, sz, 1);
  while (m--) {
    scanf("%d%d", &x, &y);
    cnt = 0;
    if (x > y)
      query(y + 1, x - 1, 1, sz, 1);
    else
      query(y + 1, x + hj - 1, 1, sz, 1);
    printf("%I64d\n", get());
  }
  return 0;
}
