#include<bits/stdc++.h>
using namespace std;
const int N=114514,inf=-1000000000;
int a[N<<1],h[N<<1],n,m,t[N<<1],x,y,d;
struct whatever{
#define lc p<<1
#define rc p<<1|1
#define mid (f[p].l+f[p].r>>1)
#define emp (orz127){0,0,0,0,0}
struct orz127{
int l,r,up,lo,ans;
void clear(){up=lo=ans=inf;return;}
orz127 operator+(orz127 a){
orz127 c;
c.up=max(up,a.up);c.lo=max(lo,a.lo);
c.ans=max(max(ans,a.ans),lo+a.up);
return c;
}
}f[N<<3];
void build(int p,int l,int r){
f[p].l=l;f[p].r=r;
if(l==r){
f[p].clear();
f[p].lo=h[r]*2-t[r-1];
f[p].up=h[r]*2+t[r-1];
return;
}
build(lc,l,mid);build(rc,mid+1,r);
f[p]=f[lc]+f[rc];
}
orz127 query(int p,int l,int r){
if(l>r)return emp;
if(l<=f[p].l&&r>=f[p].r)return f[p];
orz127 sa;sa.clear();
if(l<=mid)sa=sa+query(lc,l,r);
if(r>mid)sa=sa+query(rc,l,r);
return sa;
}
}lzj;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){scanf("%d",&a[i]);a[i+n]=a[i];}
for(int i=1;i<=n;++i){scanf("%d",&h[i]);h[i+n]=h[i];}n*=2;
for(int i=1;i<=n;++i)t[i]=a[i]+t[i-1];
lzj.build(1,1,n);
//cout<<n;
//printf(" %d %d",lzj.f[1].l,lzj.f[1].r);
//for(int i=1;i<=n*2;++i)cout<<f[i].l<<' '<<f[i].r<<endl;
for(int i=1;i<=m;++i){
scanf("%d%d",&x,&y);
if(x<=y)d=lzj.query(1,y+1,x+(n>>1)-1).ans;
else d=lzj.query(1,y+1,x-1).ans;
printf("%d\n",d);
}
return 0;
}