#include <iostream>
#include <algorithm>
using namespace std;
struct Node
{
long long t;
long long w;
} node[1000100];
bool cmp(Node a, Node b)
{
return a.t<b.t;
}
int main()
{
int n,m;
int d;
while(cin>>n>>m)
{
for(int i=0; i<n; i++)
{
cin>>node[i].t>>node[i].w;
}
sort(node,node+n,cmp);
for(int i=n-2; i>=0; i--)
{
node[i].w=max(node[i].w,node[i+1].w);
}
for(int i=0; i<m; i++)
{
cin>>d;
int l=0,r=n;
int mid;
if(d>node[n-1].t)
{
cout<<-1<<endl;
continue;
}
while(l<r)
{
mid=(l+r)/2;
if(node[mid].t>=d)
{
r=mid;
}
else
{
l=mid+1;
}
//cout<<l<<"--"<<r<<endl;
}
cout<<node[l].w<<endl;
}
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;
// 用二維vector來表示矩陣
typedef vector<ll> vec;
typedef vector<vec> mat;
// 模
const int M = 1000000007;
// 計算 A*B
mat mul(mat& A, mat& B)
{
mat C(A.size(), vec(B[0].size()));
for ( int i = 0 ; i < A.size() ; ++ i )
{
for ( int k = 0 ; k < B.size() ; ++ k )
{
for ( int j = 0 ; j < B[0].size() ; ++ j )
{
C[i][j] = (C[i][j]+A[i][k]*B[k][j]%M)%M;
}
}
}
return C;
}
// 計算 A^B
mat pow(mat A, ll n)
{
mat B(A.size(), vec(A.size()));
for ( int i = 0 ; i < A.size() ; ++ i )
{
B[i][i] = 1;
}
while ( n > 0 )
{
if ( n & 1 ) B = mul(B, A);
A = mul(A, A);
n >>= 1;
}
return B;
}
int main()
{
long long n,a,b,c,f;
long long f0,f1,f2;
mat A(6, vec(6));
while(cin>>n>>a>>b>>c>>f)
{
f0=f;
f1=a*f+32768;
f2=a*f1+b*f0+6+32767;
if(n ==0)
{
cout<<f0<<endl;
continue;
}
if(n==1){
cout<<f1<<endl;
continue;
}
if(n==2){
cout<<f2<<endl;
continue;
}
for ( int i = 0 ; i < 6 ; ++ i )
{
for ( int j = 0 ; j < 6 ; ++ j )
{
A[i][j] = 0;
}
}
A[0][0] = a;
A[0][1] = b;
A[0][2] = c;
A[0][3] = 2;
A[0][4] = 3;
A[0][5] = 32768;
A[1][0] = 1;
A[2][1] = 1;
A[3][3] = 1;
A[3][4] = 2;
A[3][5] = 1;
A[4][4] = 1;
A[4][5] = 1;
A[5][5] = 1;
A = pow(A, n-2);
ll ans = 0;
ans+=(f2*A[0][0]+f1*A[0][1]+f0*A[0][2]+4*A[0][3]+2*A[0][4]+A[0][5])%M;
printf( "%lld\n", ans );
}
return 0;
}