#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const int N = 801010;
const long double eps = 1e-4;
int n, m;
long long d[N], h[N], dis[N];
struct sta {
  long long a, b, mx;
  void update(sta l, sta r) {
    a = max(l.a, r.a);
    b = max(l.b, r.b);
    mx = max(r.a + l.b, max(l.mx, r.mx));
  }
} a[N];
void build(int p, int l, int r) {
  if (l == r) {
    a[p].a = 2 * h[l] + d[l];
    a[p].b = 2 * h[l] - d[l];
    a[p].mx = -inf;
    return;
  }
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
  a[p].update(a[p << 1], a[p << 1 | 1]);
}
sta query(int p, int l, int r, int s, int t) {
  if (l == s && r == t) {
    return a[p];
  }
  int mid = (l + r) >> 1;
  if (t <= mid)
    return query(p << 1, l, mid, s, t);
  else if (s > mid)
    return query(p << 1 | 1, mid + 1, r, s, t);
  else {
    sta t1 = query(p << 1, l, mid, s, mid);
    sta t2 = query(p << 1 | 1, mid + 1, r, mid + 1, t);
    sta now;
    now.update(t1, t2);
    return now;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%lld", &dis[i]), d[i + 1] = d[i] + dis[i];
  for (int i = n + 1; i <= n + n; i++) d[i + 1] = d[i] + dis[i - n];
  for (int i = 1; i <= n; i++) scanf("%lld", &h[i]), h[i + n] = h[i];
  build(1, 1, n * 2);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    if (x > y) y += n;
    sta ans = query(1, 1, n << 1, y + 1, n + x - 1);
    printf("%lld\n", ans.mx);
  }
  return 0;
}
