#include <bits/stdc++.h>
using namespace std;
const int inf = ~0U >> 1;
const long long INF = ~0ULL >> 1;
template <class T>
inline void read(T &n) {
  char c;
  for (c = getchar(); !(c >= '0' && c <= '9'); c = getchar())
    ;
  n = c - '0';
  for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) n = n * 10 + c - '0';
}
int Pow(int base, int n, int mo) {
  if (n == 0) return 1;
  if (n == 1) return base % mo;
  int tmp = Pow(base, n >> 1, mo);
  tmp = (long long)tmp * tmp % mo;
  if (n & 1) tmp = (long long)tmp * base % mo;
  return tmp;
}
const int maxn = 120000;
struct info {
  long long f, f1, f2;
  info() {}
  info(long long _f, long long _f1, long long _f2) : f(_f), f1(_f1), f2(_f2) {}
};
struct node {
  int l, r;
  info F;
} t[maxn * 5];
int n, m, a[maxn], b[maxn], h[maxn], d[maxn];
long long s[maxn];
void build(int p, int l, int r) {
  t[p].l = l;
  t[p].r = r;
  if (l != r) {
    build(p << 1, l, l + r >> 1);
    build(p << 1 | 1, (l + r >> 1) + 1, r);
    t[p].F.f = max(t[p << 1].F.f, t[p << 1 | 1].F.f);
    t[p].F.f = max(t[p].F.f, t[p << 1].F.f1 + t[p << 1 | 1].F.f2);
    t[p].F.f1 = max(t[p << 1].F.f1, t[p << 1 | 1].F.f1);
    t[p].F.f2 = max(t[p << 1].F.f2, t[p << 1 | 1].F.f2);
  } else {
    t[p].F.f = 0;
    t[p].F.f1 = (long long)h[l] - s[l - 1];
    t[p].F.f2 = (long long)h[l] + s[l - 1];
  }
}
info query(int p, int l, int r) {
  if (l > r) return info(0, -INF, -INF);
  if (t[p].l == l && t[p].r == r) return t[p].F;
  int m = t[p].l + t[p].r >> 1;
  if (r <= m)
    return query(p << 1, l, r);
  else if (l > m)
    return query(p << 1 | 1, l, r);
  else {
    info L = query(p << 1, l, m);
    info R = query(p << 1 | 1, m + 1, r);
    info ret = info(max(L.f, R.f), max(L.f1, R.f1), max(L.f2, R.f2));
    if (L.f1 + R.f2 > ret.f) ret.f = L.f1 + R.f2;
    return ret;
  }
}
int main() {
  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]), h[i] <<= 1;
  for (int i = (1); i <= (m); ++i) scanf("%d%d", &a[i], &b[i]);
  for (int i = (1); i <= (n); ++i) s[i] = s[i - 1] + d[i];
  build(1, 1, n);
  for (int i = (1); i <= (m); ++i) {
    if (a[i] > b[i]) {
      swap(a[i], b[i]);
      printf("%lld\n", query(1, a[i] + 1, b[i] - 1).f);
    } else {
      info L = query(1, 1, a[i] - 1);
      info R = query(1, b[i] + 1, n);
      long long ret = 0;
      ret = max(ret, L.f);
      ret = max(ret, R.f);
      if (L.f2 != -INF && R.f1 != -INF) ret = max(ret, s[n] + L.f2 + R.f1);
      printf("%lld\n", ret);
    }
  }
  return 0;
}
