#include <bits/stdc++.h>
using namespace std;
struct ext {
  long long ma, lft, rgt;
  ext() {}
  ext(long long _ma, long long _lft, long long _rgt) {
    ma = _ma;
    lft = _lft;
    rgt = _rgt;
  }
};
long long ara[300000], ht[300000], dis[300000];
ext tree[2000000];
void build(int node, int st, int en) {
  if (st == en) {
    tree[node].ma = 0;
    tree[node].lft = 2 * ht[st] - ara[st];
    tree[node].rgt = 2 * ht[st] + ara[st];
    return;
  }
  int mid = (st + en) >> 1;
  build(node * 2, st, mid);
  build(node * 2 + 1, mid + 1, en);
  tree[node].ma = max(max(tree[node * 2].ma, tree[node * 2 + 1].ma),
                      tree[node * 2].lft + tree[node * 2 + 1].rgt);
  tree[node].lft = max(tree[node * 2].lft, tree[node * 2 + 1].lft);
  tree[node].rgt = max(tree[node * 2].rgt, tree[node * 2 + 1].rgt);
}
ext big = ext(-2147899999999999LL, -2147899999999999LL, -2147899999999999LL);
ext query(int node, int st, int en, int l, int r) {
  if (st > r or en < l) return big;
  if (st >= l and en <= r) return tree[node];
  int mid = (st + en) / 2;
  ext p = query(node * 2, st, mid, l, r);
  ext q = query(node * 2 + 1, mid + 1, en, l, r);
  ext ret;
  ret.ma = max(max(p.ma, q.ma), p.lft + q.rgt);
  ret.lft = max(p.lft, q.lft);
  ret.rgt = max(p.rgt, q.rgt);
  return ret;
}
int main() {
  int i, j, k, l, m, n, a, b;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &dis[i]);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &ht[i]);
    ht[n + i] = ht[i];
  }
  for (int i = 1; i <= n; i++) {
    ara[i] = dis[i - 1] + ara[i - 1];
  }
  for (int i = 1; i <= n; i++) {
    if (i == 1)
      ara[i + n] = ara[n] + dis[n];
    else
      ara[i + n] = ara[i + n - 1] + dis[i - 1];
  }
  build(1, 1, 2 * n);
  while (m--) {
    scanf("%lld%lld", &a, &b);
    ext rt;
    if (a > b) {
      rt = query(1, 1, 2 * n, b + 1, a - 1);
    } else {
      rt = query(1, 1, 2 * n, b + 1, a + n - 1);
    }
    printf("%lld\n", rt.ma);
  }
}
