#include <bits/stdc++.h>   using namespace std;   template <typename T>   inline T read() {     T s = 0, f = 1;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (isdigit(ch)) {       s = (s << 3) + (s << 1) + ch - 48;       ch = getchar();     }     return s * f;   }   template <typename T>   inline void print(T x) {     if (x < 0) putchar( - ), x = -x;     if (x > 9) print(x / 10);     putchar(x % 10 +  0 );   }   const int N = 2e5 + 100;   const int mod = 1e9 + 7;   long long h[N], w[N], sum[N];   struct Segment {     static const int maxn = 2e5 + 100;     struct star {       long long lsum, rsum, sum;     } s[maxn << 2];     void pushup(int node, int l, int r) {       int mid = l + r >> 1;       s[node].lsum =           max(s[node << 1].lsum, h[l] + sum[mid - 1] - sum[l - 1] +                                      s[node << 1 | 1].lsum - h[mid + 1] + w[mid]);       s[node].lsum = max(s[node].lsum, h[l] + h[mid + 1] + sum[mid] - sum[l - 1]);       s[node].rsum =           max(s[node << 1 | 1].rsum,               h[r] + sum[r - 1] - sum[mid] + s[node << 1].rsum - h[mid] + w[mid]);       s[node].rsum = max(s[node].rsum, h[r] + h[mid] + sum[r - 1] - sum[mid - 1]);       s[node].sum = max(s[node << 1].rsum + s[node << 1 | 1].lsum - h[mid] -                             h[mid + 1] + w[mid],                         max(s[node << 1].sum, s[node << 1 | 1].sum));       s[node].sum = max(s[node].sum, max(s[node].lsum, s[node].rsum));       s[node].sum = max(s[node].sum, h[r] + h[l] + sum[r - 1] - sum[l - 1]);       s[node].sum = max(           s[node].sum, max(s[node << 1].rsum - h[mid] + h[mid + 1] + w[mid],                            s[node << 1 | 1].lsum - h[mid + 1] + h[mid] + w[mid]));       s[node].sum = max(s[node].sum, h[mid] + h[mid + 1] + w[mid]);     }     void build(int node, int l, int r) {       if (l == r) {         s[node].lsum = s[node].rsum = h[l];         s[node].sum = 0;         return;       }       int mid = l + r >> 1;       build(node << 1, l, mid);       build(node << 1 | 1, mid + 1, r);       pushup(node, l, r);     }     star query(int node, int l, int r, int L, int R) {       if (L == l && R == r) {         return s[node];       }       int mid = l + r >> 1;       if (R <= mid)         return query(node << 1, l, mid, L, R);       else if (L > mid)         return query(node << 1 | 1, mid + 1, r, L, R);       else {         star lnode = query(node << 1, l, mid, L, mid);         star rnode = query(node << 1 | 1, mid + 1, r, mid + 1, R);         star now;         now.lsum = max(lnode.lsum, h[L] + sum[mid - 1] - sum[L - 1] + rnode.lsum -                                        h[mid + 1] + w[mid]);         now.lsum = max(now.lsum, h[L] + h[mid + 1] + sum[mid] - sum[L - 1]);         now.rsum = max(rnode.rsum, h[R] + sum[R - 1] - sum[mid] + lnode.rsum -                                        h[mid] + w[mid]);         now.rsum = max(now.rsum, h[R] + h[mid] + sum[R - 1] - sum[mid - 1]);         now.sum = max(lnode.rsum + rnode.lsum - h[mid] - h[mid + 1] + w[mid],                       max(lnode.sum, rnode.sum));         now.sum = max(now.sum, max(now.lsum, now.rsum));         now.sum = max(now.sum, h[L] + h[R] + sum[R - 1] - sum[L - 1]);         now.sum = max(now.sum, max(lnode.rsum - h[mid] + h[mid + 1] + w[mid],                                    rnode.lsum - h[mid + 1] + h[mid] + w[mid]));         now.sum = max(now.sum, h[mid] + h[mid + 1] + w[mid]);         return now;       }     }   } tree;   int main() {     int n = read<int>(), m = read<int>();     for (int i = 1; i <= n; ++i) {       w[i] = read<long long>();       w[i + n] = w[i];       sum[i] = sum[i - 1] + w[i];     }     for (int i = 1; i <= n; ++i) {       h[i] = read<long long>();       h[i] = h[i] + h[i];       h[i + n] = h[i];     }     for (int i = n + 1; i <= n + n; ++i) {       sum[i] = sum[i - 1] + w[i];     }     tree.build(1, 1, n + n);     for (int i = 1; i <= m; ++i) {       int l = read<int>(), r = read<int>();       int lc, rc;       if (r >= l)         lc = r + 1, rc = l + n - 1;       else         lc = r + 1, rc = l - 1;       printf( %lld n , tree.query(1, 1, n + n, lc, rc).sum);     }   }   