#include<bits/stdc++.h>
using namespace std;
int a[250005],b[250005];
struct treea{
	int l,r,maxn;
}tr[1000005];
struct treeb{
	int l,r,maxn;
}trb[1000005];
void updata(int root){
	tr[root].maxn=max(tr[root<<1].maxn,tr[root<<1|1].maxn);
}
void updatab(int root){
	trb[root].maxn=max(trb[root<<1].maxn,trb[root<<1|1].maxn);
}
unsigned long long ans,cnt;
void builda(int root,int l,int r){
	tr[root].l=l;tr[root].r=r;
	tr[root].maxn=0;
	if(l==r){
		tr[root].maxn=a[l];
		return;
	}
	int mid=(l+r)>>1;
	builda(root<<1,l,mid);
	builda(root<<1|1,mid+1,r);
	updata(root);
}
void buildb(int root,int l,int r){
	trb[root].l=l;trb[root].r=r;
	trb[root].maxn=0;
	if(l==r){
		trb[root].maxn=b[l];
		return;
	}
	int mid=(l+r)>>1;
	buildb(root<<1,l,mid);
	buildb(root<<1|1,mid+1,r);
	updatab(root);
}
int aska(int root,int l,int r){
	if(l<=tr[root].l&&tr[root].r<=r)return tr[root].maxn;
	int mid=(tr[root].l+tr[root].r)>>1;
	int ans=0;
	if(l<=mid)ans=max(ans,aska(root<<1,l,r));
	if(mid<r)ans=max(ans,aska(root<<1|1,l,r));
	return ans;
}
int askb(int root,int l,int r){
	if(l<=trb[root].l&&trb[root].r<=r)return trb[root].maxn;
	int mid=(trb[root].l+trb[root].r)>>1;
	int ans=0;
	if(l<=mid)ans=max(ans,askb(root<<1,l,r));
	if(mid<r)ans=max(ans,askb(root<<1|1,l,r));
	return ans;
}
int t,n,q,l,r;
int main(){
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	cin>>t>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	cin>>q;
	builda(1,1,n);
	buildb(1,1,n);
	if(n<=30){
		while(q--){
			ans=0;
			cin>>l>>r;
			for(int i=l;i<=r;i++){
				for(int j=i;j<=r;j++){
					ans+=aska(1,i,j)*askb(1,i,j);
					//ans%=(1<<64);
				}
			}
		cout<<ans<<endl;
		}	
	}	
	else{
		while(q--){
			ans=0;
			cin>>l>>r;
			for(int i=l;i<=r;i++){
				ans+=a[i]*(i-l+1);				
			}
			cout<<ans<<endl;
		}		
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
