#include <bits/stdc++.h>
using namespace std;
template <long long MAXN>
struct segtr {
  struct node {
    long long x, pos;
    node(long long x = INT64_MIN / 10, long long pos = 0) : x(x), pos(pos) {}
    node& operator+=(const node& other) {
      if (x < other.x) {
        x = other.x;
        pos = other.pos;
      }
      return *this;
    }
    node operator+(const node& other) {
      node tmp = *this;
      return tmp += other;
    }
  };
  node a[2 * MAXN];
  void init() {
    for (long long i = 1; i <= MAXN; ++i) {
      a[i + MAXN - 1] = node(INT64_MIN / 10, i);
    }
    for (long long i = MAXN - 1; i > 0; --i) {
      a[i] = a[2 * i] + a[2 * i + 1];
    }
  }
  void set(long long pos, node val) {
    pos += MAXN - 1;
    a[pos].x = val.x;
    while (pos > 1) {
      pos /= 2;
      a[pos] = a[2 * pos] + a[2 * pos + 1];
    }
  }
  inline void add(long long pos, node val) {
    set(pos, node{a[pos + MAXN - 1] + val});
  }
  node get(long long l, long long r, long long pos = 1, long long rl = 1,
           long long rr = MAXN) {
    if (r < rl || rr < l) {
      return node{};
    }
    if (l <= rl && rr <= r) {
      return a[pos];
    }
    long long rm = (rl + rr) / 2;
    return get(l, r, 2 * pos, rl, rm) + get(l, r, 2 * pos + 1, rm + 1, rr);
  }
};
segtr<131072 * 2> drvo[2];
struct st {
  long long d;
  long long h;
};
long long n;
long long solve(long long x, long long y, long long i) {
  auto k = drvo[i].get(x, y);
  long long tmp = drvo[1 - i].get(k.pos, k.pos).x;
  drvo[1 - i].set(k.pos, INT64_MIN / 10);
  long long sol = drvo[1 - i].get(x, y).x + k.x;
  drvo[1 - i].set(k.pos, tmp);
  return sol;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cerr.tie(nullptr);
  long long m;
  cin >> n >> m;
  vector<long long> d(n);
  for (auto& i : d) cin >> i;
  vector<long long> h(n);
  for (auto& i : h) cin >> i;
  vector<st> a;
  for (long long i = 0; i < 2 * n; ++i) {
    a.push_back({d[i % n], h[i % n]});
  }
  for (long long i = 0; i < 2; ++i) drvo[i].init();
  long long s = 0;
  for (long long i = 0; i < 2 * n; ++i) {
    drvo[0].set(i + 1, s + 2 * a[i].h);
    drvo[1].set(i + 1, 2 * a[i].h - s);
    s += a[i].d;
  }
  long long maxi = *max_element(h.begin(), h.end());
  for (long long e = 0; e < m; ++e) {
    long long x, y;
    cin >> x >> y;
    long long sol = 0;
    if (y < x) {
      sol = max(sol, solve(y + 1, x - 1, 0));
      sol = max(sol, solve(y + 1, x - 1, 1));
    } else {
      if (x > 1) {
        sol = max(sol, solve(1, x - 1, 0));
        sol = max(sol, solve(1, x - 1, 1));
        sol = max(sol, solve(n + 1, n + x - 1, 1));
        sol = max(sol, solve(n + 1, n + x - 1, 0));
        sol = max(sol, solve(y + 1, n + x - 1, 0));
        sol = max(sol, solve(y + 1, n + x - 1, 1));
      }
      if (y < n) {
        sol = max(sol, solve(y + 1, n, 0));
        sol = max(sol, solve(y + 1, n, 1));
        sol = max(sol, solve(y + n + 1, 2 * n, 0));
        sol = max(sol, solve(y + 1 + n, 2 * n, 1));
      }
    }
    cout << sol << '\n';
  }
}
