#include <bits/stdc++.h>
using namespace std;
const int N = 2e5;
const long long inf = -1e18;
pair<long long, int> m1[4 * N + 100], m2[4 * N + 100];
long long h[2 * N + 100], d[N + 100];
vector<pair<int, int> > Q;
void build1(int v, int tl, int tr) {
  if (tl == tr) {
    m1[v] = make_pair(d[tl] + 2 * h[tl], tl);
  } else {
    int tm = (tl + tr) / 2;
    build1(v * 2, tl, tm);
    build1(v * 2 + 1, tm + 1, tr);
    m1[v] = max(m1[v * 2], m1[v * 2 + 1]);
  }
}
void build2(int v, int tl, int tr) {
  if (tl == tr) {
    m2[v] = make_pair(2 * h[tl] - d[tl], tl);
  } else {
    int tm = (tl + tr) / 2;
    build2(v * 2, tl, tm);
    build2(v * 2 + 1, tm + 1, tr);
    m2[v] = max(m2[v * 2], m2[v * 2 + 1]);
  }
}
pair<long long, int> getMax1(int v, int tl, int tr, int l, int r) {
  if (l > r) {
    return make_pair(inf, -1);
  }
  if (tl == l && tr == r) {
    return m1[v];
  } else {
    int tm = (tl + tr) / 2;
    return max(getMax1(v * 2, tl, tm, l, min(r, tm)),
               getMax1(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
  }
}
pair<long long, int> getMax2(int v, int tl, int tr, int l, int r) {
  if (l > r) {
    return make_pair(inf, -1);
  }
  if (tl == l && tr == r) {
    return m2[v];
  } else {
    int tm = (tl + tr) / 2;
    return max(getMax2(v * 2, tl, tm, l, min(r, tm)),
               getMax2(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", d + i + 1);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lld", h + i);
  }
  d[1] = d[n + 1];
  d[n + 1] = 0;
  for (int i = 1; i <= m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    Q.push_back(make_pair(a, b));
  }
  for (int i = n + 1; i <= 2 * n; i++) {
    d[i] = d[i - n];
    h[i] = h[i - n];
  }
  for (int i = 1; i <= 2 * n; i++) {
    d[i] += d[i - 1];
  }
  for (int i = 1; i <= 4 * N; i++) m2[i] = make_pair(inf, -1);
  build1(1, 1, 2 * n);
  build2(1, 1, 2 * n);
  for (auto it : Q) {
    int x = it.first, y = it.second;
    if (x <= y) {
      x = n + x;
    }
    pair<long long, int> r = getMax1(1, 1, 2 * n, y + 1, x - 1);
    pair<long long, int> l = getMax2(1, 1, 2 * n, y + 1, x - 1);
    if (r.second == l.second) {
      pair<long long, int> rt = max(getMax1(1, 1, 2 * n, y + 1, r.second - 1),
                                    getMax1(1, 1, 2 * n, r.second + 1, x - 1));
      pair<long long, int> lt = max(getMax2(1, 1, 2 * n, y + 1, r.second - 1),
                                    getMax2(1, 1, 2 * n, r.second + 1, x - 1));
      printf("%lld\n", max(r.first + lt.first, l.first + rt.first));
    } else {
      printf("%lld\n", r.first + l.first);
    }
  }
}
