#include <bits/stdc++.h>   using namespace std;   int N, M;   int d[300010];   int h[300010];   pair<long long, int> L[8 * 300010];   pair<long long, int> R[8 * 300010];   void aggL(int nodo, int left, int right, int pos, long long val) {     if (left == right) {       L[nodo] = pair<long long, int>(val, pos);       return;     }     int mid = (left + right) / 2;     if (pos <= mid)       aggL(nodo * 2, left, mid, pos, val);     else       aggL(nodo * 2 + 1, mid + 1, right, pos, val);     L[nodo] = max(L[nodo * 2], L[nodo * 2 + 1]);   }   void aggR(int nodo, int left, int right, int pos, long long val) {     if (left == right) {       R[nodo] = pair<long long, int>(val, pos);       return;     }     int mid = (left + right) / 2;     if (pos <= mid)       aggR(nodo * 2, left, mid, pos, val);     else       aggR(nodo * 2 + 1, mid + 1, right, pos, val);     R[nodo] = max(R[nodo * 2], R[nodo * 2 + 1]);   }   pair<long long, int> qL(int nodo, int left, int right, int l, int r) {     if (left == l && right == r) return L[nodo];     int mid = (left + right) / 2;     if (r <= mid) return qL(nodo * 2, left, mid, l, r);     if (l >= mid + 1) return qL(nodo * 2 + 1, mid + 1, right, l, r);     if (l <= mid && r >= mid + 1)       return max(qL(nodo * 2, left, mid, l, mid),                  qL(nodo * 2 + 1, mid + 1, right, mid + 1, r));   }   pair<long long, int> qR(int nodo, int left, int right, int l, int r) {     if (left == l && right == r) return R[nodo];     int mid = (left + right) / 2;     if (r <= mid) return qR(nodo * 2, left, mid, l, r);     if (l >= mid + 1) return qR(nodo * 2 + 1, mid + 1, right, l, r);     if (l <= mid && r >= mid + 1)       return max(qR(nodo * 2, left, mid, l, mid),                  qR(nodo * 2 + 1, mid + 1, right, mid + 1, r));   }   int main() {     ifstream in( input.txt );     cin >> N >> M;     for (int i = 0; i < N; i++) cin >> d[i];     for (int i = 0; i < N; i++) cin >> h[i];     for (int i = 0; i < 8 * 300010; i++) L[i].first = R[i].first = LLONG_MIN;     long long temp = 0;     for (int i = 0; i < N; i++) {       aggR(1, 0, 2 * 300010 - 1, i, temp + h[i] * 2);       aggL(1, 0, 2 * 300010 - 1, i, h[i] * 2 - temp);       temp += d[i];     }     for (int i = 0; i < N; i++) {       aggR(1, 0, 2 * 300010 - 1, i + N, temp + h[i] * 2);       aggL(1, 0, 2 * 300010 - 1, i + N, h[i] * 2 - temp);       temp += d[i];     }     for (int i = 0; i < M; i++) {       int a, b;       cin >> a >> b;       a--;       b--;       if (a <= b) {         temp = qR(1, 0, 2 * 300010 - 1, b + 2, N + a - 1).first;         int pos = qR(1, 0, 2 * 300010 - 1, b + 2, N + a - 1).second;         temp += qL(1, 0, 2 * 300010 - 1, b + 1, pos - 1).first;         long long res = temp;         temp = qL(1, 0, 2 * 300010 - 1, b + 1, N + a - 2).first;         pos = qL(1, 0, 2 * 300010 - 1, b + 1, N + a - 2).second;         temp += qR(1, 0, 2 * 300010 - 1, pos + 1, N + a - 1).first;         res = max(res, temp);         cout << res << endl;       } else {         temp = qR(1, 0, 2 * 300010 - 1, b + 2, a - 1).first;         int pos = qR(1, 0, 2 * 300010 - 1, b + 2, a - 1).second;         temp += qL(1, 0, 2 * 300010 - 1, b + 1, pos - 1).first;         long long res = temp;         temp = qL(1, 0, 2 * 300010 - 1, b + 1, a - 2).first;         pos = qL(1, 0, 2 * 300010 - 1, b + 1, a - 2).second;         temp += qR(1, 0, 2 * 300010 - 1, pos + 1, a - 1).first;         res = max(res, temp);         cout << res << endl;       }     }     return 0;   }