#include <bits/stdc++.h>
using namespace std;
long long modpow(long long a, long long p, long long mod) {
  long long ret = 1;
  while (p) {
    if (p & 1) ret = (ret * a) % mod;
    a = (a * a) % mod;
    p /= 2;
  }
  return ret;
}
long long power(long long a, long long p) {
  long long ret = 1;
  while (p) {
    if (p & 1) ret = (ret * a);
    a = (a * a);
    p /= 2;
  }
  return ret;
}
int n;
const int MAX = 1e5;
long long h[2 * MAX + 11], d[2 * MAX + 11];
struct node {
  long long l;
  long long r;
  long long sum;
  long long ans;
} tree[8 * MAX];
node merge(node a, node b, int t) {
  node c;
  c.sum = a.sum + b.sum + d[t];
  c.l = max(a.l, a.sum + b.l + d[t]);
  c.r = max(b.r, a.r + b.sum + d[t]);
  c.ans = max(max(a.ans, b.ans), a.r + b.l + d[t]);
  return c;
}
void build(int t = 1, int l = 1, int r = 2 * n) {
  if (l == r) {
    tree[t].l = 2 * h[l];
    tree[t].r = 2 * h[r];
    tree[t].sum = 0;
    tree[t].ans = 0;
    return;
  }
  int mid = (l + r) / 2;
  build(2 * t, l, mid);
  build(2 * t + 1, mid + 1, r);
  tree[t] = merge(tree[2 * t], tree[2 * t + 1], mid);
}
node get(int l, int r, int t = 1, int L = 1, int R = 2 * n) {
  if (r < L || l > R) {
    node nd;
    nd.l = nd.r = nd.sum = nd.ans = -100000000000LL;
    return nd;
  }
  if (l <= L && r >= R) return tree[t];
  int mid = (L + R) / 2;
  node n1, n2;
  n1 = get(l, r, 2 * t, L, mid);
  n2 = get(l, r, 2 * t + 1, mid + 1, R);
  return merge(n1, n2, mid);
}
int main() {
  int i, j, tmp;
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  int q, x, y;
  cin >> n >> q;
  for (i = 1; i < n + 1; i++) {
    cin >> d[i];
    d[i + n] = d[i];
  }
  for (i = 1; i < n + 1; i++) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  build();
  while (q--) {
    cin >> x >> y;
    if (y >= x) x += n;
    swap(x, y);
    x++;
    y--;
    node nd = get(x, y);
    cout << nd.ans << endl;
  }
  return 0;
}
