#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100005;
const int LOGMAX = 20;
const int INF = (1 << 29);
int n, m;
long long d[NMAX], sum[NMAX * 2], h[NMAX * 2], rmq[LOGMAX][NMAX * 2][3];
int logg[NMAX * 2];
int pos[LOGMAX][NMAX * 2];
long long getMax(int a, int b, int tip) {
  int k = logg[b - a + 1];
  int a2 = b - (1 << k) + 1;
  return max(rmq[k][a][tip], rmq[k][a2][tip]);
}
long long query(int a, int b) {
  if (b < a) return 0;
  if (a == b - 1) {
    return sum[b] - sum[a] + 2 * (h[a] + h[b]);
  } else if (a == b) {
    return 2 * h[a];
  }
  int k = logg[b - a + 1];
  int a2 = b - (1 << k) + 1;
  int pos1 = pos[k][a];
  long long x1 = rmq[k][a][1];
  if (rmq[k][a2][1] > x1) {
    pos1 = pos[k][a2];
    x1 = rmq[k][a2][1];
  }
  long long maxx = -INF;
  if (1 < 2) {
    int a3 = a;
    int pos2 = pos1;
    long long x2 = x1;
    a = pos1 + 1;
    if (a > b) {
      a = a3;
      pos1 = pos2;
      x1 = x2;
    } else {
      k = logg[b - a + 1];
      a2 = b - (1 << k) + 1;
      pos1 = pos[k][a];
      x1 = rmq[k][a][1];
      if (rmq[k][a2][1] > x1) {
        pos1 = pos[k][a2];
        x1 = rmq[k][a2][1];
      }
      maxx = x1 + getMax(a3, pos1 - 1, 0);
      a = a3;
      pos1 = pos2;
      x1 = x2;
    }
  }
  if (pos1 != a) {
    return max(maxx, (long long)(x1 + getMax(a, pos1 - 1, 0)));
  } else {
    return maxx;
  }
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> d[i], sum[i + 1] = sum[i] + d[i];
  for (int i = n + 1; i + 1 <= 2 * n; ++i) sum[i + 1] = sum[i] + d[i - n];
  for (int i = 1; i <= n; ++i) cin >> h[i];
  for (int i = n + 1; i <= n * 2; ++i) h[i] = h[i - n];
  for (int i = 2; i <= 2 * n; ++i) {
    logg[i] = logg[i / 2] + 1;
  }
  for (int i = 1; i <= 2 * n; ++i)
    rmq[0][i][0] = -sum[i] + 2 * h[i], rmq[0][i][1] = sum[i] + 2 * h[i],
    pos[0][i] = i;
  for (int i = 1; i < LOGMAX; ++i) {
    for (int j = 1; j <= 2 * n; ++j) {
      for (int k = 0; k < 2; ++k) {
        rmq[i][j][k] = rmq[i - 1][j][k];
        if (k == 1) pos[i][j] = pos[i - 1][j];
        int unde = j + (1 << i) - 1;
        int newJ = unde - (1 << (i - 1)) + 1;
        if (rmq[i - 1][newJ][k] > rmq[i][j][k]) {
          rmq[i][j][k] = rmq[i - 1][newJ][k];
          if (k == 1) pos[i][j] = pos[i - 1][newJ];
        }
      }
    }
  }
  for (int i = 1; i <= m; ++i) {
    int ai, bi;
    cin >> ai >> bi;
    if (ai <= bi) {
      cout << max(query(1, ai - 1), query(bi + 1, ai + n - 1)) << "\n";
    } else {
      cout << query(bi + 1, ai - 1) << "\n";
    }
  }
  return 0;
}
