#include <bits/stdc++.h>
using namespace std;
template <class T>
bool ckmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <class T>
bool ckmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
void __print(int x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }
template <typename T, typename V>
void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T>
void __print(const T &x) {
  int f = 0;
  cerr << '{';
  for (auto z : x) cerr << (f++ ? "," : ""), __print(z);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v)) cerr << ", ";
  _print(v...);
}
const char nl = '\n';
const int mxN = 2e5 + 12;
const long long INF = 1e18;
struct node {
  long long l, r, ans;
  node(long long l2 = -INF, long long r2 = -INF, long long ans2 = -INF)
      : l(l2), r(r2), ans(ans2) {}
  node operator+(const node &b) {
    return {max(l, b.l), max(r, b.r), max({ans, b.ans, l + b.r})};
  }
} st[4 * mxN];
int n, m;
void build(const vector<node> &v, int i = 1, int l2 = 0, int r2 = n - 1) {
  if (l2 == r2) {
    st[i] = v[l2];
    return;
  }
  int m2 = (l2 + r2) / 2;
  build(v, 2 * i, l2, m2);
  build(v, 2 * i + 1, m2 + 1, r2);
  st[i] = st[2 * i] + st[2 * i + 1];
}
node query(int l1, int r1, int i = 1, int l2 = 0, int r2 = n - 1) {
  if (l1 <= l2 && r2 <= r1) {
    return st[i];
  }
  int m2 = (l2 + r2) / 2;
  node ans;
  if (l1 <= m2) ans = ans + query(l1, r1, 2 * i, l2, m2);
  if (m2 + 1 <= r1) ans = ans + query(l1, r1, 2 * i + 1, m2 + 1, r2);
  return ans;
}
void solve() {
  cin >> n >> m;
  vector<long long> pref(2 * n, 0LL);
  for (int i = 0; i < n; ++i) {
    long long num;
    cin >> num;
    pref[i + 1] = pref[i] + num;
  }
  for (int i = n + 1; i < 2 * n; ++i) {
    pref[i] = pref[n] + pref[i - n];
  };
  vector<long long> h(2 * n);
  for (int i = 0; i < n; ++i) {
    cin >> h[i];
    h[i + n] = h[i];
  }
  vector<node> v(2 * n);
  for (int i = 0; i < 2 * n; ++i) {
    v[i] = node{2 * h[i] - pref[i], 2 * h[i] + pref[i], -INF};
  }
  n *= 2;
  build(v);
  while (m--) {
    int a, b;
    cin >> a >> b;
    --a, --b;
    if (a <= b) {
      cout << query(b + 1, a + n / 2 - 1).ans << nl;
    } else {
      cout << query(b + 1, a - 1).ans << nl;
    }
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int testCases = 1;
  while (testCases--) solve();
}
