#include <bits/stdc++.h>
using namespace std;
int d[200010], h[200010];
long long L[200010], R[200010];
struct _ {
  long long val;
  int id;
  bool operator>(const _ &ob) const { return val > ob.val; }
};
_ lmax[800010], lse[800010];
_ rmax[800010], rse[800010];
pair<_, _> mix(pair<_, _> x, pair<_, _> y) {
  _ a[4] = {x.first, x.second, y.first, y.second};
  sort(a, a + 4, greater<_>());
  return make_pair(a[0], a[1]);
}
void pushupl(int rt) {
  pair<_, _> temp = mix(make_pair(lmax[rt << 1], lse[rt << 1]),
                        make_pair(lmax[rt << 1 | 1], lse[rt << 1 | 1]));
  lmax[rt] = temp.first;
  lse[rt] = temp.second;
}
void buildl(int l, int r, int rt) {
  if (l == r) {
    lmax[rt] = (_){L[l], l};
    lse[rt] = (_){-998244353998244353, -1};
    return;
  }
  int m = l + r >> 1;
  buildl(l, m, rt << 1);
  buildl(m + 1, r, rt << 1 | 1);
  pushupl(rt);
}
pair<_, _> queryl(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) return make_pair(lmax[rt], lse[rt]);
  int m = l + r >> 1;
  pair<_, _> t1, t2;
  if (m >= L) {
    t1 = queryl(L, R, l, m, rt << 1);
    if (m < R) {
      t2 = queryl(L, R, m + 1, r, rt << 1 | 1);
      return mix(t1, t2);
    }
    return t1;
  } else
    return queryl(L, R, m + 1, r, rt << 1 | 1);
}
void pushupr(int rt) {
  pair<_, _> temp = mix(make_pair(rmax[rt << 1], rse[rt << 1]),
                        make_pair(rmax[rt << 1 | 1], rse[rt << 1 | 1]));
  rmax[rt] = temp.first;
  rse[rt] = temp.second;
}
void buildr(int l, int r, int rt) {
  if (l == r) {
    rmax[rt] = (_){R[l], l};
    rse[rt] = (_){-998244353998244353, -1};
    return;
  }
  int m = l + r >> 1;
  buildr(l, m, rt << 1);
  buildr(m + 1, r, rt << 1 | 1);
  pushupr(rt);
}
pair<_, _> queryr(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) return make_pair(rmax[rt], rse[rt]);
  int m = l + r >> 1;
  pair<_, _> t1, t2;
  if (m >= L) {
    t1 = queryr(L, R, l, m, rt << 1);
    if (m < R) {
      t2 = queryr(L, R, m + 1, r, rt << 1 | 1);
      return mix(t1, t2);
    }
    return t1;
  } else
    return queryr(L, R, m + 1, r, rt << 1 | 1);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  int i;
  for (i = 1; i <= n; i++) {
    scanf("%d", &d[i % n + 1]);
  }
  for (i = 1; i <= n; i++) {
    scanf("%d", &h[i]);
  }
  for (i = 1; i <= n; i++) {
    d[i + n] = d[i];
    h[i + n] = h[i];
  }
  long long sum = 0;
  for (i = 1; i <= n << 1; i++) {
    sum += d[i];
    L[i] = sum + (h[i] << 1);
    R[i] = -sum + (h[i] << 1);
  }
  buildl(1, n << 1, 1);
  buildr(1, n << 1, 1);
  pair<_, _> t1, t2;
  int l, r;
  for (i = 0; i < m; i++) {
    scanf("%d%d", &l, &r);
    if (l <= r) {
      t1 = queryl(r + 1, l + n - 1, 1, n << 1, 1);
      t2 = queryr(r + 1, l + n - 1, 1, n << 1, 1);
    } else {
      t1 = queryl(r + 1, l - 1, 1, n << 1, 1);
      t2 = queryr(r + 1, l - 1, 1, n << 1, 1);
    }
    if (t1.first.id != t2.first.id)
      printf("%lld\n", t1.first.val + t2.first.val);
    else {
      long long t;
      t = max(t1.second.val + t2.first.val, t1.first.val + t2.second.val);
      printf("%lld\n", t);
    }
  }
  return 0;
}
