#include <bits/stdc++.h>
using namespace std;
int d[100010], h[100010];
long long int qsd[100010];
struct node {
  int s, m, e;
  long long int l, r, sum;
};
node T[300100];
void buildTree(int c, int s, int e) {
  T[c].s = s;
  T[c].e = e;
  if (s == e) {
    T[c].l = 2LL * (long long int)h[s] - qsd[s];
    T[c].r = 2LL * (long long int)h[s] + qsd[s];
    T[c].sum = -8000000000000000000LL;
    return;
  }
  T[c].m = (s + e) / 2;
  buildTree(c * 2, s, T[c].m);
  buildTree(c * 2 + 1, T[c].m + 1, T[c].e);
  T[c].l = max(T[c * 2].l, T[c * 2 + 1].l);
  T[c].r = max(T[c * 2].r, T[c * 2 + 1].r);
  T[c].sum = max(T[c * 2].sum, T[c * 2 + 1].sum);
  T[c].sum = max(T[c].sum, T[c * 2].l + T[c * 2 + 1].r);
}
long long int frontquery(int c, int s, int e) {
  if (T[c].e < s || e < T[c].s) {
    return -8000000000000000000LL;
  }
  if (s <= T[c].s && T[c].e <= e) {
    return T[c].r;
  }
  return max(frontquery(c * 2, s, e), frontquery(c * 2 + 1, s, e));
}
long long int backquery(int c, int s, int e) {
  if (T[c].e < s || e < T[c].s) {
    return -8000000000000000000LL;
  }
  if (s <= T[c].s && T[c].e <= e) {
    return T[c].l;
  }
  return max(backquery(c * 2, s, e), backquery(c * 2 + 1, s, e));
}
long long int query(int c, int s, int e) {
  if (T[c].e < s || e < T[c].s) {
    return -8000000000000000000LL;
  }
  if (s <= T[c].s && T[c].e <= e) {
    return T[c].sum;
  }
  long long int res = max(query(c * 2, s, e), query(c * 2 + 1, s, e));
  res = max(res, backquery(c * 2, s, e) + frontquery(c * 2 + 1, s, e));
  return res;
}
int main() {
  int n, m, i, a, b;
  scanf("%d%d", &n, &m);
  qsd[1] = 0LL;
  for (i = 1; i <= n; i++) {
    scanf("%d", d + i + 1);
    qsd[i + 1] = (long long int)d[i + 1] + qsd[i];
  }
  for (i = 1; i <= n; i++) {
    scanf("%d", h + i);
  }
  buildTree(1, 1, n);
  for (i = 0; i < m; i++) {
    scanf("%d%d", &a, &b);
    if (a <= b) {
      if (a == 1) {
        printf("%I64d\n", query(1, b + 1, n));
      } else if (b == n) {
        printf("%I64d\n", query(1, 1, a - 1));
      } else {
        printf("%I64d\n", max(max(query(1, 1, a - 1), query(1, b + 1, n)),
                              qsd[n + 1] + frontquery(1, 1, a - 1) +
                                  backquery(1, b + 1, n)));
      }
    } else {
      printf("%I64d\n", query(1, b + 1, a - 1));
    }
  }
}
