#include <bits/stdc++.h>
using namespace std;
int N, M;
long long tree[100010 * 10][3];
int pos[100010 * 10][3];
long long D[100010 * 10], H[100010 * 10];
long long Dsums[100010 * 10];
void build(int node, int start, int end) {
  if (start == end) {
    tree[node][0] = Dsums[start] + 2LL * H[start % N];
    tree[node][1] = 2LL * H[start % N] - Dsums[start];
    pos[node][0] = pos[node][1] = start;
    return;
  }
  int mid = (start + end) / 2;
  build((node << 1), start, mid);
  build(((node << 1) + 1), mid + 1, end);
  if (tree[(node << 1)][0] > tree[((node << 1) + 1)][0])
    pos[node][0] = pos[(node << 1)][0];
  else
    pos[node][0] = pos[((node << 1) + 1)][0];
  if (tree[(node << 1)][1] > tree[((node << 1) + 1)][1])
    pos[node][1] = pos[(node << 1)][1];
  else
    pos[node][1] = pos[((node << 1) + 1)][1];
  tree[node][0] = max(tree[(node << 1)][0], tree[((node << 1) + 1)][0]);
  tree[node][1] = max(tree[(node << 1)][1], tree[((node << 1) + 1)][1]);
}
pair<long long, long long> query1(int node, int start, int end, int left,
                                  int right) {
  if (start >= left and right >= end) {
    pair<long long, long long> ret =
        pair<long long, long long>(tree[node][0], pos[node][0]);
    return ret;
  }
  int mid = (start + end) / 2;
  if (mid >= right)
    return query1((node << 1), start, mid, left, right);
  else if (left > mid)
    return query1(((node << 1) + 1), mid + 1, end, left, right);
  else {
    pair<long long, long long> ret, aa, bb;
    aa = query1((node << 1), start, mid, left, mid);
    bb = query1(((node << 1) + 1), mid + 1, end, mid + 1, right);
    if (aa.first > bb.first) {
      ret.first = aa.first;
      ret.second = aa.second;
    } else {
      ret.first = bb.first;
      ret.second = bb.second;
    }
    return ret;
  }
}
pair<long long, long long> query2(int node, int start, int end, int left,
                                  int right) {
  if (start >= left and right >= end) {
    pair<long long, long long> ret =
        pair<long long, long long>(tree[node][1], pos[node][1]);
    return ret;
  }
  int mid = (start + end) / 2;
  if (mid >= right)
    return query2((node << 1), start, mid, left, right);
  else if (left > mid)
    return query2(((node << 1) + 1), mid + 1, end, left, right);
  else {
    pair<long long, long long> ret, aa, bb;
    aa = query2((node << 1), start, mid, left, mid);
    bb = query2(((node << 1) + 1), mid + 1, end, mid + 1, right);
    if (aa.first > bb.first) {
      ret.first = aa.first;
      ret.second = aa.second;
    } else {
      ret.first = bb.first;
      ret.second = bb.second;
    }
    return ret;
  }
}
inline void ReadInput(void) {
  scanf("%d", &N);
  scanf("%d", &M);
  for (int i = 0; i < N; i++) {
    scanf("%I64d", &D[i]);
    Dsums[i + 1] = Dsums[i] + D[i];
  }
  for (int i = N; i < 2 * N; i++) {
    Dsums[i + 1] = Dsums[i] + D[i % N];
  }
  for (int i = 0; i < N; i++) {
    scanf("%I64d", &H[i]);
  }
}
inline void solve(void) {
  build(1, 0, 2 * N - 1);
  while (M--) {
    int a, b;
    scanf("%d", &a);
    scanf("%d", &b);
    a--;
    b--;
    if (a <= b) {
      a += N;
      b++;
      a--;
      pair<long long, long long> ret = query1(1, 0, 2 * N - 1, b, a);
      int poshere = ret.second;
      long long foo, bar;
      long long ans;
      if (poshere == b) {
        foo = query2(1, 0, 2 * N - 1, b + 1, a).first;
      } else if (poshere == a) {
        foo = query2(1, 0, 2 * N - 1, b, a - 1).first;
      } else {
        foo = query2(1, 0, 2 * N - 1, b, poshere - 1).first;
        bar = query2(1, 0, 2 * N - 1, poshere + 1, a).first;
        foo = max(foo, bar);
      }
      ans = ret.first + foo;
      ret = query2(1, 0, 2 * N - 1, b, a);
      poshere = ret.second;
      if (poshere == b) {
        foo = query1(1, 0, 2 * N - 1, b + 1, a).first;
      } else if (poshere == a) {
        foo = query1(1, 0, 2 * N - 1, b, a - 1).first;
      } else {
        foo = query1(1, 0, 2 * N - 1, b, poshere - 1).first;
        bar = query1(1, 0, 2 * N - 1, poshere + 1, a).first;
        foo = max(foo, bar);
      }
      ans = max(ans, ret.first + foo);
      cout << ans << endl;
    } else {
      b++;
      a--;
      pair<long long, long long> ret = query1(1, 0, 2 * N - 1, b, a);
      int poshere = ret.second;
      long long foo, bar;
      long long ans;
      if (poshere == b) {
        foo = query2(1, 0, 2 * N - 1, b + 1, a).first;
      } else if (poshere == a) {
        foo = query2(1, 0, 2 * N - 1, b, a - 1).first;
      } else {
        foo = query2(1, 0, 2 * N - 1, b, poshere - 1).first;
        bar = query2(1, 0, 2 * N - 1, poshere + 1, a).first;
        foo = max(foo, bar);
      }
      ans = ret.first + foo;
      ret = query2(1, 0, 2 * N - 1, b, a);
      poshere = ret.second;
      if (poshere == b) {
        foo = query1(1, 0, 2 * N - 1, b + 1, a).first;
      } else if (poshere == a) {
        foo = query1(1, 0, 2 * N - 1, b, a - 1).first;
      } else {
        foo = query1(1, 0, 2 * N - 1, b, poshere - 1).first;
        bar = query1(1, 0, 2 * N - 1, poshere + 1, a).first;
        foo = max(foo, bar);
      }
      ans = max(ans, ret.first + foo);
      cout << ans << endl;
    }
  }
}
inline void Refresh(void) {}
int main() {
  ios_base::sync_with_stdio(false);
  ReadInput();
  solve();
  return 0;
}
