#include<bits/stdc++.h>
using namespace std;
#define N 250005
#define ll long long
int T,n;
int a[N],b[N];
struct node{
	int l,r,w;
}x[N<<2],y[N<<2];
void build1(int rt,int l,int r){
	if(l==r) x[rt].w=a[l];
	int mid=(l+r)<<2;
	build1(rt<<1,l,mid);
	build1(rt<<1|1,mid+1,r);
	x[rt].w=max(x[rt<<1].w,x[rt<<1|1].w);
}
void build2(int rt,int l,int r){
	if(l==r) y[rt].w=b[l];
	int mid=(l+r)<<2;
	build2(rt<<1,l,mid);
	build2(rt<<1|1,mid+1,r);
	y[rt].w=max(y[rt<<1].w,y[rt<<1|1].w);
}
int query1(int rt,int L,int R){
	if(x[rt].l>R||x[rt].r<L) return 0;
	if(L<x[rt].l&&x[rt].r<R) return x[rt].w;
	return max(query1(rt<<1,L,R),query1(rt<<1|1,L,R));
}
int query2(int rt,int L,int R){
	if(y[rt].l>R||y[rt].r<L) return 0;
	if(L<y[rt].l&&y[rt].r<R) return y[rt].w;
	return max(query2(rt<<1,L,R),query2(rt<<1|1,L,R));
}
int sum[25],cs,tmp[25];
int mod[25]={0,6,1,6,1,5,5,9,0,7,3,7,0,4,4,7,6,4,4,8,1};
int Q,l,r;
ll m1,m2,maxn;
void add(){
	int cnt=0;
	while(maxn){
		tmp[++cnt]=maxn%10;
		maxn/=10;
	}
	for(int i=1,w;i<=cnt;i++){
		w=tmp[i]+sum[i];
		sum[i]=w%10;
		sum[i+1]+=w/10;
		tmp[i]=0;
	}
	for(cs=22;cs>=1;cs--) if(sum[cs]<=0) break;
	bool flag=0;
	int k;
	if(cs<20) return;
	if(cs>20) flag=1;
	if(!flag){
		for(k=20;k>=1&&sum[k]==mod[k];k--);
		if(sum[k]>mod[k]) flag=1;
	}
	if(flag){
		for(int i=1;i<=cs;i++){
			if(sum[i]<mod[i]){
				sum[i+1]--;
				sum[i]+=10-mod[i];
			}
			else sum[i]-=mod[i];
		}
	}
	for(cs=22;cs>=1;cs--) if(sum[cs]<=0) break;
}
int main(){
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	scanf("%d%d",&T,&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	build1(1,1,n),     build2(1,1,n);
	scanf("%d",&Q);
	while(Q--){
		scanf("%d%d",&l,&r);
		for(int p=l;p<=r;p++){
			for(int q=l;q<=r;q++){
				m1=query1(1,p,q);
				m2=query2(1,p,q);
				maxn=m1*m2;
				add();
			}
		}
		for(int i=cs;i>=1;sum[i]=0,i--) printf("%d",sum[i]);
		printf("\n");
	}
	return 0;
}
