#include <bits/stdc++.h>
using namespace std;
const int SIZE = 10e5 + 10;
pair<int, int> st[SIZE];
pair<int, int> S[SIZE];
long long int A[2 * 100000 + 10];
long long int B[2 * 100000 + 10];
long long int energie(const int x, const int y) {
  if (x == 0 && y == 0) return 0;
  return (x != y) ? 2 * (B[x] + B[y]) + A[y] - A[x] : 2 * B[x];
}
long long int max(const long long int a, const long long int b,
                  const long long int c, long long int d) {
  return max(max(a, b), max(c, d));
}
pair<int, int> combine(const pair<int, int>& a, const pair<int, int>& b) {
  long long int d1 = energie(a.first, a.second);
  long long int d2 = energie(b.first, b.second);
  long long int d3 = energie(a.first, b.first);
  long long int d4 = energie(a.first, b.second);
  long long int maxi1 = max(d1, d2, d3, d4);
  long long int d5 = energie(a.second, b.first);
  long long int d6 = energie(a.second, b.second);
  long long int maxi2 = max(d5, d6);
  long long int maxi = max(maxi1, maxi2);
  if (d1 == maxi) return a;
  if (d2 == maxi) return b;
  if (d3 == maxi) return make_pair(a.first, b.first);
  if (d4 == maxi) return make_pair(a.first, b.second);
  if (d5 == maxi) return make_pair(a.second, b.first);
  if (d6 == maxi) return make_pair(a.second, b.second);
}
void build(int p, int l, int r) {
  if (l == r)
    st[p] = make_pair(l, l);
  else {
    int mid = (l + r) >> 1;
    build(p << 1, l, mid);
    build((p << 1) + 1, mid + 1, r);
    st[p] = combine(st[p << 1], st[(p << 1) + 1]);
  }
}
void Build(int p, int l, int r) {
  if (l == r)
    S[p] = make_pair(l, l);
  else {
    int mid = (l + r) >> 1;
    Build(p << 1, l, mid);
    Build((p << 1) + 1, mid + 1, r);
    S[p] = combine(S[p << 1], S[(p << 1) + 1]);
  }
}
pair<int, int> query(int p, int l, int r, int i, int j) {
  if (j < l || r < i) return make_pair(-1, -1);
  if (i <= l && r <= j) return st[p];
  int mid = (l + r) >> 1;
  pair<int, int> p1 = query(p << 1, l, mid, i, j);
  pair<int, int> p2 = query((p << 1) + 1, mid + 1, r, i, j);
  if (p1.first == -1 && p1.second == -1) return p2;
  if (p2.first == -1 && p2.second == -1) return p1;
  return combine(p1, p2);
}
pair<int, int> Query(int p, long long int l, long long int r, int i, int j) {
  if (j < l || r < i) return make_pair(-1, -1);
  if (i <= l && r <= j) return S[p];
  int mid = (l + r) >> 1;
  pair<int, int> p1 = Query(p << 1, l, mid, i, j);
  pair<int, int> p2 = Query((p << 1) + 1, mid + 1, r, i, j);
  if (p1.first == -1 && p1.second == -1) return p2;
  if (p2.first == -1 && p2.second == -1) return p1;
  return combine(p1, p2);
}
int main() {
  int n = 0;
  int m = 0;
  int l = 0;
  int r = 0;
  scanf("%d%d", &n, &m);
  A[0] = 0, A[1] = 0;
  B[0] = 0;
  for (int i = 2; i < n + 2; ++i) {
    scanf("%lli", &A[i]);
  }
  for (int j = n + 2; j < 2 * n + 1; ++j) {
    A[j] = A[j - n];
  }
  for (int i = 1; i < n + 1; ++i) {
    scanf("%lli", &B[i]);
  }
  for (int j = n + 1; j < 2 * n; ++j) {
    B[j] = B[j - n];
  }
  for (int i = 2; i < 2 * n; ++i) {
    A[i] += A[i - 1];
  }
  pair<int, int> b;
  pair<int, int> A1;
  pair<int, int> B1;
  build(1, 1, 2 * n);
  Build(1, 1, n);
  long long int ans = 0;
  for (int i = 1; i < m + 1; ++i) {
    scanf("%d%d", &l, &r);
    if (l == 1 && r == n) return 0;
    if (l <= r) {
      b = query(1, 1, 2 * n, r + 1, n + l - 1);
      A1 = (l != 1) ? Query(1, 1, n, 1, l - 1) : make_pair(0, 0);
      B1 = ((r + 1) != n) ? Query(1, 1, n, r + 1, n) : make_pair(0, 0);
      ans = max(1, energie(b.first, b.second), energie(A1.first, A1.second),
                energie(B1.first, B1.second));
      printf("%lli\n", ans);
    } else {
      A1 = Query(1, 1, n, r + 1, l - 1);
      printf("%lli\n", energie(A1.first, A1.second));
    }
  }
  return 0;
}
