#include <bits/stdc++.h>
using namespace std;
const int MAXN = 210000;
const long long oo = MAXN * 1000000000LL;
long long dist[MAXN];
long long height[MAXN];
long long suff[MAXN];
int n, m;
struct Node {
  long long max_sum, min_sum, sol;
} tree[MAXN << 2];
Node operator+(const Node &a, const Node &b) {
  Node ret;
  ret.sol = max(a.sol, b.sol);
  ret.sol = max(ret.sol, a.max_sum - b.min_sum);
  ret.min_sum = min(a.min_sum, b.min_sum);
  ret.max_sum = max(a.max_sum, b.max_sum);
  return ret;
}
void build(int i, int l, int r) {
  if (l + 1 == r) {
    tree[i] = {height[l] + suff[l], suff[l] - height[l], -oo};
  } else {
    build(2 * i, l, (l + r) / 2);
    build(2 * i + 1, (l + r) / 2, r);
    tree[i] = tree[2 * i] + tree[2 * i + 1];
  }
}
Node query(int i, int l, int r, int x, int y) {
  if (l >= y || r <= x) {
    return {-oo, +oo, -oo};
  }
  if (l >= x && r <= y) {
    return tree[i];
  }
  return query(2 * i, l, (l + r) / 2, x, y) +
         query(2 * i + 1, (l + r) / 2, r, x, y);
}
int main() {
  cin.sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < n; ++i) {
    cin >> dist[i];
    dist[i + n] = dist[i];
  }
  for (int i = 0; i < n; ++i) {
    cin >> height[i];
    height[i] <<= 1;
    height[i + n] = height[i];
  }
  suff[2 * n - 1] = dist[2 * n - 1];
  for (int i = 2 * n - 2; i >= 0; --i) {
    suff[i] = suff[i + 1] + dist[i];
  }
  build(1, 0, 2 * n);
  while (m--) {
    int x, y;
    cin >> x >> y;
    --x, --y;
    if (x <= y) {
      int l = y + 1, r = x + n;
      Node ans = query(1, 0, 2 * n, l, r);
      cout << ans.sol << endl;
    } else {
      int l = y + n + 1, r = x + n;
      Node ans = query(1, 0, 2 * n, l, r);
      cout << ans.sol << endl;
    }
  }
  return 0;
}
