#include <bits/stdc++.h>   using namespace std;   template <typename T>   void maxE(T& a, const T& b) {     a = max(a, b);   }   template <typename T>   void minE(T& a, const T& b) {     a = min(a, b);   }   template <typename T>   ostream& operator<<(ostream& out, const vector<T>& t_) {     out <<  [ ;     for (auto i : t_) out << i <<  ,  ;     out <<  ] ;     return out;   }   template <typename S, typename T>   ostream& operator<<(ostream& out, const pair<S, T>& rhs) {     out <<  (  << rhs.first <<  ,  << rhs.second <<  ) ;     return out;   }   const long long INF = 1000LL * 1000 * 1000 * 1000 * 1000 * 1000LL;   struct Val {     long long maxPref, maxSuf, sum, maxInf;   };   Val neutral() {     Val r;     r.maxPref = r.maxSuf = r.maxInf = 0;     r.sum = 0;     return r;   }   Val single(long long a) {     Val r;     r.maxPref = r.maxSuf = r.maxInf = max(0LL, a);     r.sum = a;     return r;   }   Val join(const Val& a, const Val& b) {     Val r;     r.maxPref = max(a.maxPref, a.sum + b.maxPref);     r.maxSuf = max(a.maxSuf + b.sum, b.maxSuf);     r.sum = a.sum + b.sum;     r.maxInf = max(max(a.maxInf, b.maxInf), a.maxSuf + b.maxPref);     return r;   }   struct Tree {     int s;     vector<Val> t;     void init(int s_) {       s = 1;       while (s <= s_) s *= 2;       t.assign(2 * s, neutral());     }     Val tget(int a, int b) {       if (a > b)         return neutral();       else if (a == b)         return t[a];       Val r = neutral();       int na = a;       int nb = b;       if (a % 2) na++;       if (nb % 2 == 0) nb--;       if (a % 2) r = join(r, t[a]);       r = join(r, tget(na / 2, nb / 2));       if (b % 2 == 0) r = join(r, t[b]);       return r;     }     long long get(int a, int b) { return tget(s + a, s + b).maxInf; }   };   int n;   vector<long long> t;   Tree tree;   int main() {     int m;     assert(scanf( %d%d , &n, &m) == 2);     vector<int> d, h;     for (int i = 0; i < int(n); ++i) {       int a;       assert(scanf( %d , &a) == 1);       d.push_back(a);     }     for (int i = 0; i < int(n); ++i) {       int a;       assert(scanf( %d , &a) == 1);       h.push_back(a);     }     for (int j = 0; j < int(2); ++j)       for (int i = 0; i < int(n); ++i) {         t.push_back(h[i] * 2LL);         t.push_back(-4LL * h[i]);         t.push_back(h[i] * 2LL);         t.push_back(d[i]);       }     tree.init(((int)((t).size())));     for (int i = 0; i < int(((int)((t).size()))); ++i)       tree.t[tree.s + i] = single(t[i]);     for (int i = tree.s - 1; i >= 1; i--)       tree.t[i] = join(tree.t[i * 2], tree.t[i * 2 + 1]);     if (0) cout <<  tree ready   << endl;     if (0)       cout <<  SIZE(t)             <<     << ((int)((t).size())) <<     << endl;     for (int i = 0; i < int(m); ++i) {       int a, b;       assert(scanf( %d%d , &a, &b) == 2);       a--;       b--;       int x, y;       if (a <= b) {         x = b + 1;         y = a + n - 1;       } else {         x = b + 1;         y = a - 1;       }       assert(x < y);       if (0)         cout <<  a               <<     << a <<                  <<  b               <<     << b <<                  <<  x               <<     << x <<                  <<  y               <<     << y <<     << endl;       x = 4 * x;       y = 4 * y;       int s = ((int)((t).size()));       assert(x >= 0 && x < s && y >= 0 && y < s);       cout << tree.get(x, y) << endl;     }     return 0;   }   