#include <bits/stdc++.h>
const int sizeOfTree = 131072;
const int sizeOfSeg = 524288;
inline int getint();
inline void putint(long long);
inline long long max(long long, long long);
struct node {
  long long lmax, rmax;
  long long ssum, smax;
  inline node(long long = 0, long long = 0, long long = 0, long long = 0);
};
inline node merge(node, long long, node);
struct seg {
  node d;
  seg *l, *r;
};
seg memory[sizeOfSeg], *port = memory;
inline seg* newseg();
seg* build(int, int);
node query(seg*, int, int, int, int);
int n, m;
seg* t;
int d[sizeOfTree], h[sizeOfTree];
long long s[sizeOfTree];
int main() {
  n = getint(), m = getint();
  for (int i = 1; i <= n; i++) d[i] = getint();
  for (int i = 1; i <= n; i++) h[i] = getint() << 1;
  for (int i = 1; i <= n; i++) s[i] = s[i - 1] + d[i - 1];
  t = build(1, n);
  for (int i = 1; i <= m; i++) {
    int a = getint(), b = getint();
    if (a <= b)
      putint(
          merge(query(t, 1, n, b + 1, n), d[n], query(t, 1, n, 1, a - 1)).smax);
    else
      putint(query(t, 1, n, b + 1, a - 1).smax);
  }
  return 0;
}
inline int getint() {
  register int num = 0;
  register char ch;
  do ch = getchar();
  while (ch < '0' || ch > '9');
  do num = num * 10 + ch - '0', ch = getchar();
  while (ch >= '0' && ch <= '9');
  return num;
}
inline void putint(long long num) {
  char stack[16];
  register int top = 0;
  if (num == 0) stack[top = 1] = '0';
  for (; num; num /= 10) stack[++top] = num % 10 + '0';
  for (; top; top--) putchar(stack[top]);
  putchar('\n');
}
inline long long max(long long x, long long y) { return x > y ? x : y; }
inline node::node(long long _lmax, long long _rmax, long long _ssum,
                  long long _smax) {
  lmax = _lmax, rmax = _rmax;
  ssum = _ssum, smax = _smax;
}
inline node merge(node a, long long d, node b) {
  node c;
  if (b.lmax > 0)
    c.lmax = max(a.lmax, a.ssum + d + b.lmax);
  else
    c.lmax = a.lmax;
  if (a.rmax > 0)
    c.rmax = max(a.rmax + d + b.ssum, b.rmax);
  else
    c.rmax = b.rmax;
  c.ssum = a.ssum + d + b.ssum;
  c.smax = max(a.smax, b.smax);
  if (a.rmax > 0 && b.lmax > 0) c.smax = max(c.smax, a.rmax + d + b.lmax);
  return c;
}
inline seg* newseg() {
  seg* t = port++;
  t->d = node();
  t->l = t->r = NULL;
  return t;
}
seg* build(int l, int r) {
  seg* t = newseg();
  int m = (l + r) >> 1;
  if (l == r) {
    t->d.lmax = t->d.rmax = h[m];
    t->d.ssum = 0, t->d.smax = h[m];
  } else {
    t->l = build(l, m);
    t->r = build(m + 1, r);
    t->d = merge(t->l->d, s[m + 1] - s[m], t->r->d);
  }
  return t;
}
node query(seg* t, int l, int r, int ql, int qr) {
  if (ql > qr) return node();
  int m = (l + r) >> 1;
  if (l == ql && r == qr) return t->d;
  if (qr <= m)
    return query(t->l, l, m, ql, qr);
  else if (ql > m)
    return query(t->r, m + 1, r, ql, qr);
  return merge(query(t->l, l, m, ql, m), s[m + 1] - s[m],
               query(t->r, m + 1, r, m + 1, qr));
}
