#include<bits/stdc++.h>
using namespace std;
const int N=1000000,M=5000000;
int n,m,now,lst[N+5];
unsigned int a[N+5],b[N+5],c[N+5],v[N+5],ad[N+5],ans[M+5];
struct node{
int l,id;
};
vector<node>w[N+5];
unsigned int gcd(int i,int j){
while(j){
i%=j;swap(i,j);
}
return i;
}
unsigned int gt(int i){
return v[i]+ad[i]*(now-lst[i]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%u",&a[i]);
for(int i=1;i<=n;i++) scanf("%u",&b[i]);
for(int i=1;i<=n;i++) scanf("%u",&c[i]);
for(int i=1,l,r;i<=m;i++){
scanf("%d%d",&l,&r);
w[r].push_back((node){l,i});
}
for(int i=1;i<=n;i++){
int j=i-1;
while(j){
int v1,v2,v3;
v1=a[j]&a[j+1];
v2=b[j]|b[j+1];
v3=gcd(c[j],c[j+1]);
if(v1a[j]&&v2b[j]&&v3==c[j]) break;
a[j]=v1;b[j]=v2;c[j]=v3;
--j;
}
v[i]=gt(i-1);
for(int k=j+1;k<=i;k++){
v[k]=gt(k);
ad[k]=ad[k-1]+a[k]*b[k]*c[k];
lst[k]=now;
}
now;
for(int k=0;k<w[i].size();k){
ans[w[i][k].id]=gt(i)-gt(w[i][k].l-1);
}
}
for(int i=1;i<=m;i++){
printf("%u\n",ans[i]);
}
return 0;
}