// Author:A weak man named EricQian
// Attention:Check your code while coding
// 20 pts
#include<bits/stdc++.h>
using namespace std;
#define infll 0x3f3f3f3f3f3f3f3fll
#define inf 0x3f3f3f3f
#define pb push_back
#define eb emplace_back
#define pa pair<int,int>
#define fi first
#define se second
#define all(x) ((x).bgein(),(x).end())
typedef unsigned long long ull;
#define Maxn 3005
#define Maxlogn 20
inline int rd()
{
	int x=0;
	char ch,t=0;
	while(!isdigit(ch = getchar())) t|=ch=='-';
	while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
	return t?-x:x;
}
int id,n,q,cntque;
int a[Maxn],b[Maxn];
ull ans[Maxn][Maxn];
//ull ansx[Maxn],ansy[Maxn],ans[Maxn];
//struct ST
//{
//	int lg[Maxn],pow2[Maxlogn];
//	pa maxx[Maxlogn][Maxn];
//	inline void init()
//	{
//		pow2[0]=1;
//		for(int i=1;i<=19;i++) pow2[i]=pow2[i-1]*2;
//		for(int i=1;i<=n;i++) lg[i]=lg[i/2]+1;
//	}
//	inline void solve()
//	{
//		for(int i=1;i<=18;i++)
//			for(int j=1;j<=n-pow2[i]+1;j++)
//				maxx[i][j]=max(maxx[i-1][j],maxx[i-1][j+pow2[i-1]]);
//	}
//	inline pa query(int l,int r)
//	{
//		int p=lg[r-l+1]-1;
//		return max(maxx[p][l],maxx[p][r-pow2[p]+1]);
//	}
//}st;
//struct exBIT
//{
//	ull tree[Maxn];
//	inline void add(int x,ull y){ while(x<=n) tree[x]+=y,x+=x&(-x); }
//	inline ull query(int x){ ull ret=0; while(x) ret+=tree[x],x-=x&(-x); return ret; }
//};
//exBIT T1,T2;
//inline void ADD(int pos,ull val) { T1.add(pos,val),T2.add(pos,1llu*pos*val); }
//inline ull QUERY(int pos) { return 1llu*pos*T1.query(pos)-T2.query(pos); }
//struct Operation
//{
//	int typ,bel,pos; ull val; int num;
//	Operation(int _typ=0,int _bel=0,int _pos=0,ull _val=0,int _num=0):
//		typ(_typ),bel(_bel),pos(_pos),val(_val),num(_num){}
//	inline bool friend operator < (Operation x,Operation y)
//		{ return (x.pos!=y.pos)?(x.pos<y.pos):(x.typ<y.typ); }
//};
//Operation Que[Maxn];
//vector<Operation> opt;
//inline void Push(int lx,int ly,int rx,int ry,ull val)
//{
//	opt.eb(0,lx,rx,val,-1);
//	opt.eb(0,lx,ry+1,-val,-1);
//	opt.eb(0,ly+1,rx,-val,-1);
//	opt.eb(0,ly+1,ry+1,val,-1);
//}
//inline void build(int l,int r)
//{
//	pa cur=st.query(l,r);
//	int mid=cur.se;
//	printf("build(%d %d) mid %d maxx %d\n",l,r,mid,cur.fi);
//	if(mid>l) build(l,mid-1);
//	if(mid<r) build(mid+1,r);
//	Push(l,mid,mid,r,cur.fi);
//}
//void solve(int pl,int pr)
//{
//	if(pl==pr) return;
//	int mid=(pl+pr)>>1;
//	solve(pl,mid),solve(mid+1,pr);
//	int nl=pl-1;
//	for(int nr=mid+1;nr<=pr;nr++) if(opt[nr].typ==1)
//	{
//		while(nl<mid && opt[nl+1].bel<=opt[nr].bel)
//		{
//			nl++;
//			if(opt[nl+1].typ==0) ADD(opt[nl].pos,opt[nl].val);
//		}
//		ans[opt[nr].num]+=QUERY(opt[nr].pos)*opt[nr].val;
//	}
//	for(int i=pl;i<=nl;i++) if(opt[i].typ==0) ADD(opt[i].pos,-opt[i].val);
//	inplace_merge(opt.begin()+pl,opt.begin()+mid+1,opt.begin()+pr+1);
//}
int main()
{
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	id=rd(),n=rd();
//	st.init();
	for(int i=1;i<=n;i++) a[i]=rd();
	for(int i=1;i<=n;i++) b[i]=rd();
	for(int l=1,ma,mb;l<=n;l++)
	{
		ma=-1,mb=-1;
		for(int r=l;r<=n;r++)
		{
			ma=max(ma,a[r]),mb=max(mb,b[r]);
			ans[l][r]=ans[l][r-1]+1llu*ma*mb;
		}
	}
	q=rd();
	for(int i=1,L,R;i<=q;i++)
	{
		L=rd(),R=rd(); ull ret=0;
		for(int l=L;l<=R;l++) ret+=ans[l][R];
		printf("%llu\n",ret);
//		for(int l=L;l<=R;l++)
//			Que[++cntque]=Operation(1,l,L,1,i),
//			Que[++cntque]=Operation(1,l,R+1,-1,i);
	}
//	for(int i=1;i<=n;i++) st.maxx[0][i]=pa(a[i],i);
//	st.solve(),build(1,n);
//	for(int i=1;i<=cntque;i++) opt.pb(Que[i]);
//	for(auto v:opt) printf("<%d %d %d %llu %d>\n",v.typ,v.bel,v.pos,v.val,v.num);
//	solve(0,opt.size()-1);
//	printf("\n\n");
//	for(int i=1;i<=q;i++) ansx[i]=ans[i];
//	for(int i=1;i<=q;i++) printf("%llu(%llu) ",ansx[i],-ansx[i]);
//	printf("\n");
//	for(int i=1;i<=n;i++) st.maxx[0][i]=pa(b[i],i);
//	st.solve(),opt.clear(),build(1,n);
//	for(int i=1;i<=cntque;i++) opt.pb(Que[i]);
//	solve(0,opt.size()-1);
//	for(int i=1;i<=q;i++) ansy[i]=ans[i];
//	for(int i=1;i<=q;i++) printf("%llu\n",ansx[i]*ansy[i]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
