#include<bits/stdc++.h>
using namespace std;
const int N=250005;
inline long long read(){
	long long t=1,x=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') t=-1;
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return t*x;
}
long long t,n,m;
long long a[N],b[N];
long long tree1[N<<2],tree2[N<<2];

void pushup(long long root){
	tree1[root]=max(tree1[root<<1],tree1[root<<1|1]);
}
void build(long long root,long long ll,long long rr){
	if(ll==rr){
		tree1[root]=a[ll];
		return ;
	}
	long long mid=(ll+rr)>>1;
	build(root<<1,ll,mid);
	build(root<<1|1,mid+1,rr);
	pushup(root);
}
long long qurey(long long root,long long ll,long long rr,long long l,long long r){
	if(l<=ll && rr<=r) return tree1[root];
	long long mid=(ll+rr)>>1;
	long long maxx=-1e9;
	if(mid>=l) maxx=max(maxx,qurey(root<<1,ll,mid,l,r));
	if(mid<r) maxx=max(maxx,qurey(root<<1|1,mid+1,rr,l,r));
	return maxx;
}
void pushup1(long long root){
	tree2[root]=max(tree2[root<<1],tree2[root<<1|1]);
}
void build1(long long root,long long ll,long long rr){
	if(ll==rr){
		tree2[root]=b[ll];
		return ;
	}
	long long mid=(ll+rr)>>1;
	build1(root<<1,ll,mid);
	build1(root<<1|1,mid+1,rr);
	pushup1(root);
}
long long qurey1(long long root,long long ll,long long rr,long long l,long long r){
	if(l<=ll && rr<=r) return tree2[root];
	long long mid=(ll+rr)>>1;
	long long maxx=-1e9;
	if(mid>=l) maxx=max(maxx,qurey1(root<<1,ll,mid,l,r));
	if(mid<r) maxx=max(maxx,qurey1(root<<1|1,mid+1,rr,l,r));
	return maxx;
}
int main(){
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	t=read(),n=read();
	for(long long i=1;i<=n;i++) a[i]=read();
	for(long long i=1;i<=n;i++) b[i]=read();
	m=read();
	build(1,1,n);
	build1(1,1,n);
	for(long long w=1;w<=m;w++){
		long long x=read(),y=read();
		long long ans=0;
		for(long long i=x;i<=y;i++){
			for(long long j=i;j<=y;j++){
				long long max1=qurey(1,1,n,i,j);
				long long max2=qurey1(1,1,n,i,j);
				ans=(ans+(max1*max2));
			}
		}
		printf("%lld\n",ans);
	}
	fclose(stdin),fclose(stdout);
	return 0;
}
