#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
if (s == t) { t = (s = buf) + fread(buf, 1, bufl, stdin); if (s == t) return EOF; }
return *s++;
}
inline int read() {
int a = 0, b = 1, c = fetch();
while (!isdigit(c))b ^= c == '-', c = fetch();
while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
return b ? a : -a;
}
}
using ae86::read;
int n,m;
struct Tree{
int sy,sx=99999999999;
}tr[N<<5];
int h[N<<1],d[N<<1];
int qzh[N<<1];
void pushup(int u){
tr[u].sy=max(tr[u].sy,max(tr[u<<1].sy,tr[u<<1|1].sy));
tr[u].sx=min(tr[u].sx,min(tr[u<<1].sx,tr[u<<1|1].sx));
}
void build(int u,int l=1,int r=2*n){
if(l==r){
tr[u].sy=qzh[l]+2*h[l];
tr[u].sx=qzh[l]-2*h[l];
return;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
int query(int u,int l,int r,int mood,int L=1,int R=2*n){
if(l<=L&&R<=r){
if(mood)return tr[u].sy;
else return tr[u].sx;
}else{
int mid=L+R>>1,lans=0,rans=0;
if(l<=mid)lans=query(u<<1,l,r,mood,L,mid);
if(r>mid)rans=query(u<<1|1,l,r,mood,mid+1,R);
if(mood)return max(lans,rans);
else return min(lans,rans);
}
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++)d[n+i%n+1]=d[i%n+1]=read();
for(int i=1;i<=n;i++)h[n+i]=h[i]=read();
for(int i=1;i<=2*n;i++)qzh[i]=qzh[i-1]+d[i];
build(1);
while(m--){
int l=read(),r=read();
if(l<r){
swap(l,r);r+=n;
int mx=query(1,l,r,1),mn=query(1,l,r,0);
cout<<mx-mn<<'\n';
}else{
swap(l,r);
int mx=query(1,l,r,1),mn=query(1,l,r,0);
cout<<mx-mn<<'\n';
}
}
return 0;
}