#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const int rms = (1 << 19) - 1;
const int hrms = rms / 2;
const int size = 250 * 1000 + 100;
const long long inf = (long long)1e18;
const int ssize = 1000;
long long hg[size], d[size];
long long val1[size], val2[size];
long long dist[size];
pair<int, int> rmq1[rms + 1];
pair<int, int> rmq2[rms + 1];
bool comp1(int i, int j) { return val1[i] < val1[j]; }
bool comp2(int i, int j) { return val2[i] < val2[j]; }
int hlen;
int h[ssize];
pair<int, int> joinpairs1(pair<int, int> p1, pair<int, int> p2) {
  hlen = 0;
  h[hlen++] = p1.first;
  h[hlen++] = p1.second;
  h[hlen++] = p2.first;
  h[hlen++] = p2.second;
  sort(h, h + hlen, comp1);
  return make_pair(h[hlen - 1], h[hlen - 2]);
}
pair<int, int> joinpairs2(pair<int, int> p1, pair<int, int> p2) {
  hlen = 0;
  h[hlen++] = p1.first;
  h[hlen++] = p1.second;
  h[hlen++] = p2.first;
  h[hlen++] = p2.second;
  sort(h, h + hlen, comp2);
  return make_pair(h[hlen - 1], h[hlen - 2]);
}
long long trypair(int f, int s) {
  if (f == s) return -inf;
  return val1[f] + val2[s];
}
void rss1(int v, int lb, int rb, int i, int j) {
  if (lb > j || rb < i) return;
  if (lb >= i && rb <= j) {
    h[hlen++] = rmq1[v].first;
    h[hlen++] = rmq1[v].second;
    return;
  }
  rss1(v * 2, lb, (lb + rb) / 2, i, j);
  rss1(v * 2 + 1, (lb + rb) / 2 + 1, rb, i, j);
}
void rss2(int v, int lb, int rb, int i, int j) {
  if (lb > j || rb < i) return;
  if (lb >= i && rb <= j) {
    h[hlen++] = rmq2[v].first;
    h[hlen++] = rmq2[v].second;
    return;
  }
  rss2(v * 2, lb, (lb + rb) / 2, i, j);
  rss2(v * 2 + 1, (lb + rb) / 2 + 1, rb, i, j);
}
pair<int, int> getbest1(int a, int b) {
  hlen = 0;
  rss1(1, 1, hrms + 1, a, b);
  sort(h, h + hlen, comp1);
  return make_pair(h[hlen - 1], h[hlen - 2]);
}
pair<int, int> getbest2(int a, int b) {
  hlen = 0;
  rss2(1, 1, hrms + 1, a, b);
  sort(h, h + hlen, comp2);
  return make_pair(h[hlen - 1], h[hlen - 2]);
}
int n, m;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%I64d", &d[i]);
  }
  for (int i = 0; i < n; i++) {
    scanf("%I64d", &hg[i]);
  }
  for (int i = n; i < 2 * n; i++) {
    d[i] = d[i - n];
    hg[i] = hg[i - n];
  }
  dist[0] = 0;
  for (int i = 1; i < 2 * n; i++) {
    dist[i] = dist[i - 1] + d[i - 1];
  }
  for (int i = 0; i <= rms; i++) {
    rmq1[i] = make_pair(2 * n, 2 * n);
    rmq2[i] = make_pair(2 * n, 2 * n);
  }
  val1[2 * n] = -inf;
  val2[2 * n] = -inf;
  for (int i = 0; i < 2 * n; i++) {
    val1[i] = 2 * hg[i] + dist[i];
    val2[i] = 2 * hg[i] - dist[i];
    rmq1[i + hrms + 1] = make_pair(i, 2 * n);
    rmq2[i + hrms + 1] = make_pair(i, 2 * n);
  }
  for (int i = hrms; i > 0; i--) {
    rmq1[i] = joinpairs1(rmq1[i * 2], rmq1[i * 2 + 1]);
    rmq2[i] = joinpairs2(rmq2[i * 2], rmq2[i * 2 + 1]);
  }
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    if (b < a) b += n;
    int c = a + n - 1;
    pair<int, int> p1 = getbest1(b + 1, c);
    pair<int, int> p2 = getbest2(b + 1, c);
    printf(
        "%I64d\n",
        max(max(trypair(p1.first, p2.first), trypair(p1.first, p2.second)),
            max(trypair(p1.second, p2.first), trypair(p1.second, p2.second))));
  }
  return 0;
}
