#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
long long tree[8 * MAXN], lmax[8 * MAXN], rmax[8 * MAXN], total[8 * MAXN];
long long presum[2 * MAXN];
long long dist[2 * MAXN], h[2 * MAXN];
void build(int node, int l, int r) {
  if (l == r) {
    lmax[node] = rmax[node] = 2 * h[r];
    total[node] = 0;
    tree[node] = 0;
    return;
  }
  int mid = (l + r) >> 1;
  build(2 * node + 1, l, mid);
  build(2 * node + 2, mid + 1, r);
  total[node] = total[2 * node + 1] + total[2 * node + 2] + dist[mid];
  lmax[node] = max(total[2 * node + 1] + lmax[2 * node + 2] + dist[mid],
                   lmax[2 * node + 1]);
  rmax[node] = max(rmax[2 * node + 1] + total[2 * node + 2] + dist[mid],
                   rmax[2 * node + 2]);
  tree[node] = max(rmax[2 * node + 1] + lmax[2 * node + 2] + dist[mid],
                   max(tree[2 * node + 1], tree[2 * node + 2]));
}
pair<pair<long long, long long>, pair<long long, long long> > query(
    int node, int l, int r, int start, int end) {
  if (end < l || r < start) return {{0, 0}, {0, 0}};
  if (start <= l && r <= end)
    return {{tree[node], total[node]}, {lmax[node], rmax[node]}};
  int mid = (l + r) >> 1;
  auto p1 = query(2 * node + 1, l, mid, start, end);
  auto p2 = query(2 * node + 2, mid + 1, r, start, end);
  pair<pair<long long, long long>, pair<long long, long long> > ans;
  ans.first.second = p1.first.second + p2.first.second;
  if (p1.second.first && p2.second.first) ans.first.second += dist[mid];
  ans.second.first = max(p1.second.first, p2.second.first);
  if (p1.second.first && p2.second.first)
    ans.second.first =
        max(ans.second.first, p1.first.second + p2.second.first + dist[mid]);
  ans.second.second = max(p1.second.second, p2.second.second);
  if (p1.second.first && p2.second.first)
    ans.second.second =
        max(ans.second.second, p1.second.second + p2.first.second + dist[mid]);
  ans.first.first = max(p1.first.first, p2.first.first);
  if (p1.second.second && p2.second.first) {
    ans.first.first =
        max(p1.second.second + p2.second.first + dist[mid], ans.first.first);
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> dist[i];
    dist[i + n] = dist[i];
  }
  for (int i = 0; i < n; i++) cin >> h[i], h[i + n] = h[i];
  build(0, 0, 2 * n - 1);
  for (int i = 0; i < m; i++) {
    int l, r;
    cin >> l >> r;
    l--;
    r--;
    if (l <= r) {
      auto ans = query(0, 0, 2 * n - 1, r + 1, l - 1 + n);
      cout << ans.first.first << "\n";
    } else {
      auto ans = query(0, 0, 2 * n - 1, r + 1, l - 1);
      cout << ans.first.first << "\n";
    }
  }
}
