#include<bits/stdc++.h>
using namespace std;
#define L (k<<1)
#define R (L|1)
#define mid (l+r>>1)
typedef unsigned long long ull;
const int N=250005;
int n,q,x,y,t,lst,a[N],b[N],sta[N],stb[N];
ull len[N<<2],A[N<<2],B[N<<2],S1[N<<2],S2[N<<2],ans[N];
vector<pair<int,int> >v[N];
struct Line{ull A,B,C;};
struct Node{
	ull x,y;Line X,Y;
	void clr(){
		x=y=X.A=X.B=X.C=Y.A=Y.B=Y.C=0;
	}
}tag[N<<2];
Line add(Line x,Line y){
	return Line{x.A+y.A,x.B+y.B,x.C+y.C};
}
Line mul(Line k,ull x,ull y){
	return Line{k.A,k.B,k.C+x*k.A+y*k.B};
}
void upd(int k,Node x){
	S1[k]+=x.X.A*A[k]+x.X.B*B[k]+x.X.C*len[k];
	S2[k]+=x.Y.A*A[k]+x.Y.B*B[k]+x.Y.C*len[k];
	A[k]+=x.x*len[k],B[k]+=x.y*len[k];
	tag[k].X=add(tag[k].X,mul(x.X,tag[k].x,tag[k].y));
	tag[k].Y=add(tag[k].Y,mul(x.Y,tag[k].x,tag[k].y));
	tag[k].x+=x.x,tag[k].y+=x.y;
}
void up(int k){
	A[k]=A[L]+A[R];
	B[k]=B[L]+B[R];
	S1[k]=S1[L]+S1[R];
	S2[k]=S2[L]+S2[R];
}
void down(int k){
	upd(L,tag[k]),upd(R,tag[k]),tag[k].clr();
}
void build(int k,int l,int r){
	len[k]=r-l+1;
	if (l<r)build(L,l,mid),build(R,mid+1,r);
}
void update(int k,int l,int r,int x,int y,Node z){
	if ((l>y)||(x>r))return;
	if ((x<=l)&&(r<=y)){
		upd(k,z);
		return;
	}
	down(k);
	update(L,l,mid,x,y,z),update(R,mid+1,r,x,y,z);
	up(k);
}
ull query(int k,int l,int r,int x,int y){
	if ((l>y)||(x>r))return 0;
	if ((x<=l)&&(r<=y))return t*S1[k]-S2[k];
	down(k);
	return query(L,l,mid,x,y)+query(R,mid+1,r,x,y);
}
void updatea(int l,int r,ull x){
	update(1,1,n,l,r,Node{x,0,Line{0,x,0},Line{0,(t-1)*x,0}});
}
void updateb(int l,int r,ull x){
	update(1,1,n,l,r,Node{0,x,Line{x,0,0},Line{(t-1)*x,0,0}});
}
int main(){
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	scanf("%*d%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)scanf("%d",&b[i]);
	build(1,1,n);
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		scanf("%d%d",&x,&y);
		v[y].push_back(make_pair(x,i));
	}	
	for(int i=1;i<=n;i++){
		t=i,lst=0;
		while ((sta[0])&&(a[sta[sta[0]]]<a[i])){
			if (lst)updatea(sta[sta[0]]+1,lst,a[i]-a[lst]);
			lst=sta[sta[0]--];
		}
		if (lst)updatea(sta[sta[0]]+1,lst,a[i]-a[lst]);
		sta[++sta[0]]=i,updatea(i,i,a[i]);
		lst=i;
		while ((stb[0])&&(b[stb[stb[0]]]<b[i])){
			if (lst)updateb(stb[stb[0]]+1,lst,b[i]-b[lst]);
			lst=stb[stb[0]--];
		}
		if (lst)updateb(stb[stb[0]]+1,lst,b[i]-b[lst]);
		stb[++stb[0]]=i,updateb(i,i,b[i]);
		for(pair<int,int>j:v[i])ans[j.second]=query(1,1,n,j.first,i);
	}
	for(int i=1;i<=q;i++)printf("%llu\n",ans[i]);
	return 0;
}
