#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int MAXN=110;
const int mod=1e9+7;
int b[MAXN],c[MAXN],f[2][2*MAXN*MAXN],ans[MAXN<<1];

inline void add(int &x,int y)
{
	x+=y;
	if(x>=mod)
		x-=mod;
}

int main()
{
	int n,i,j,k;
	int mn,mx,x,q,res,delta,sum,sb,nxt,cur,presum,bb;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&c[i]);
	for(i=1;i<n;i++)
		scanf("%d",&b[i]);
	mn=1<<30;
	for(i=1;i<=n;i++)
	{
		sum=0;
		for(j=0;j<i;j++)
			for(k=1;k<=j;k++)
				sum+=b[k];
		mn=min(mn,-sum/i);
	}
	mx=mn+150;
	mn=mn-45;
	memset(ans,-1,sizeof(ans));
	scanf("%d",&q);
	while(q--)
	{
		scanf("%d",&x);
		x=min(mx,max(mn,x));
		if(~ans[x-mn])
		{
			printf("%d\n",ans[x-mn]);
			continue;
		}
		res=0;
		delta=sum=sb=0;
		cur=1,nxt=0;
		memset(f,0,sizeof(f));
		f[cur][0]=1;
		for(i=1;i<=n;i++)
		{
			memset(f[nxt],0,sizeof(f[nxt]));
			delta+=sb;
			for(j=0;j<=sum;j++)
			{
				presum=x*i+delta-j;
				bb=max(presum,0);
				if(bb<=c[i])
				{
					add(f[nxt][j+bb],f[cur][j]);
					add(f[nxt][j+c[i]+1],mod-f[cur][j]);
				}
			}
			sum+=c[i];
			for(j=1;j<=sum;j++)
				add(f[nxt][j],f[nxt][j-1]);
			sb+=b[i];
			swap(cur,nxt);
		}
		for(i=0;i<=sum;i++)
			add(res,f[cur][i]);
		ans[x-mn]=res;
		printf("%d\n",res);
	}
}
