#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
int d[222222], n, m;
long long dist[222222], h[222222];
struct SegmentTree {
  int l[222222 * 4], r[222222 * 4], mid[222222 * 4];
  long long maxx[222222 * 4], lmax[222222 * 4], rmax[222222 * 4];
  int gx, gy, gz;
  void build(int kok, int ll, int rr) {
    l[kok] = ll;
    r[kok] = rr;
    if (ll == rr) {
      maxx[kok] = h[ll];
      lmax[kok] = h[ll] - dist[ll];
      rmax[kok] = h[rr] + dist[rr];
      return;
    }
    int m = mid[kok] = (ll + rr) >> 1;
    build(((kok) << 1), ll, m);
    build((((kok) << 1) + 1), m + 1, rr);
    maxx[kok] = max(maxx[((kok) << 1)], maxx[(((kok) << 1) + 1)]);
    maxx[kok] = max(maxx[kok], lmax[((kok) << 1)] + rmax[(((kok) << 1) + 1)]);
    lmax[kok] = max(lmax[((kok) << 1)], lmax[(((kok) << 1) + 1)]);
    rmax[kok] = max(rmax[((kok) << 1)], rmax[(((kok) << 1) + 1)]);
  }
  void setting(int a = 0, int b = 0, int c = 0) {
    gx = a;
    gy = b;
    gz = c;
  }
  long long queryL(int kok) {
    if (gx <= l[kok] && r[kok] <= gy) {
      return lmax[kok];
    }
    if (gy <= mid[kok])
      return queryL(((kok) << 1));
    else if (gx > mid[kok])
      return queryL((((kok) << 1) + 1));
    else
      return max(queryL(((kok) << 1)), queryL((((kok) << 1) + 1)));
  }
  long long queryR(int kok) {
    if (gx <= l[kok] && r[kok] <= gy) {
      return rmax[kok];
    }
    if (gy <= mid[kok])
      return queryR(((kok) << 1));
    else if (gx > mid[kok])
      return queryR((((kok) << 1) + 1));
    else
      return max(queryR(((kok) << 1)), queryR((((kok) << 1) + 1)));
  }
  long long queryMax(int kok) {
    if (gx <= l[kok] && r[kok] <= gy) {
      return maxx[kok];
    }
    if (gy <= mid[kok])
      return queryMax(((kok) << 1));
    else if (gx > mid[kok])
      return queryMax((((kok) << 1) + 1));
    else
      return max(max(queryMax(((kok) << 1)), queryMax((((kok) << 1) + 1))),
                 queryL(((kok) << 1)) + queryR((((kok) << 1) + 1)));
  }
} Tree;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &d[i]);
    dist[i + 1] = dist[i] + d[i];
  }
  for (int i = n; i < 2 * n; ++i) {
    dist[i + 1] = dist[i] + d[(i % n) ? (i % n) : n];
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &h[i]);
    h[i] *= 2;
  }
  for (int i = n + 1; i <= 2 * n; ++i) h[i] = h[i - n];
  Tree.build(1, 1, 2 * n);
  int x, y;
  while (m--) {
    int tx, ty;
    scanf("%d%d", &x, &y);
    if (x > y) y += n;
    tx = y + 1;
    ty = x + n - 1;
    x = tx;
    y = ty;
    x = ((x % n) ? (x % n) : n);
    y = ((y % n) ? (y % n) : n);
    if (x > y) y += n;
    Tree.setting(x, y);
    cout << Tree.queryMax(1) << '\n';
  }
  return 0;
}
