#include <bits/stdc++.h>
using namespace std;
struct Node {
  long long max1, max2, best;
};
long long S[2 * 100009];
int d[2 * 100009], h[2 * 100009];
Node aib[8 * 100009];
Node unite(Node a, Node b) {
  Node rez;
  rez.max1 = max(a.max1, b.max1);
  rez.max2 = max(a.max2, b.max2);
  rez.best = max(a.best, b.best);
  rez.best = max(rez.best, (long long)b.max1 + a.max2);
  return rez;
}
void build(int node, int left, int right) {
  if (left == right) {
    aib[node].max1 = (long long)2 * h[left] + S[left];
    aib[node].max2 = (long long)2 * h[left] - S[left];
    aib[node].best = -0x3f3f3f3f;
    return;
  }
  int middle = (left + right) / 2;
  build(2 * node, left, middle);
  build(2 * node + 1, middle + 1, right);
  aib[node] = unite(aib[2 * node], aib[2 * node + 1]);
}
Node query(int node, int left, int right, int a, int b) {
  Node rez;
  if (left >= a && b >= right) return aib[node];
  int middle = (left + right) / 2;
  if (a <= middle) {
    rez = query(node * 2, left, middle, a, b);
    if (b > middle)
      rez = unite(rez, query(node * 2 + 1, middle + 1, right, a, b));
  } else if (b > middle)
    rez = query(node * 2 + 1, middle + 1, right, a, b);
  return rez;
}
int main() {
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> d[i];
    d[i + n] = d[i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  for (int i = 1; i <= 2 * n; i++) S[i] = (long long)S[i - 1] + d[i - 1];
  build(1, 1, 2 * n);
  while (k--) {
    int x, y;
    Node rez;
    cin >> x >> y;
    if (y >= x)
      rez = query(1, 1, 2 * n, y + 1, x + n - 1);
    else
      rez = query(1, 1, 2 * n, y + 1, x - 1);
    cout << rez.best << "\n";
  }
}
