#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005;
using ll = long long;
ll h[maxn], p[maxn];
struct NODE {
  ll mx1, mx2, ans;
};
NODE dummy;
NODE t[maxn << 2];
NODE join(NODE l, NODE r) {
  NODE ret;
  ret.mx1 = max(l.mx1, r.mx1);
  ret.mx2 = max(l.mx2, r.mx2);
  ret.ans = max(max(l.ans, r.ans), l.mx1 + r.mx2);
  return ret;
}
void build(int node, int b, int e) {
  if (b == e) {
    t[node].mx1 = -p[b - 1] + h[b];
    t[node].mx2 = p[b - 1] + h[b];
    t[node].ans = -1e18;
    return;
  }
  int mid = (b + e) >> 1;
  build(2 * node, b, mid);
  build(2 * node + 1, mid + 1, e);
  t[node] = join(t[2 * node], t[2 * node + 1]);
}
NODE query(int node, int b, int e, int i, int j) {
  if (i > e || j < b) return dummy;
  if (b >= i && j >= e) return t[node];
  int mid = (b + e) >> 1;
  return join(query(2 * node, b, mid, i, j),
              query(2 * node + 1, mid + 1, e, i, j));
}
int main(int argc, char const *argv[]) {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%lld", &p[i]);
    p[i + n] = p[i];
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%lld", &h[i]);
    h[i + n] = h[i];
  }
  for (int i = 1; i <= n + n; ++i) {
    p[i] += p[i - 1];
    h[i] += h[i];
  }
  build(1, 1, n + n);
  dummy.mx1 = -1e18;
  dummy.mx2 = -1e18;
  dummy.ans = -1e18;
  while (m--) {
    int a, b;
    scanf("%d %d", &a, &b);
    int l, r;
    if (a > b) {
      l = b + 1;
      r = a - 1;
    } else {
      l = b + 1;
      r = a + n - 1;
    }
    printf("%lld\n", query(1, 1, n + n, l, r).ans);
  }
  return 0;
}
