#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <cstdio>
#include <vector>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
bool dp[55][10005] = {0};
long long n, x, a[55], b[55];
int main() {
cin >> n >> x;
for (int i = 1; i <= n; i++)
cin >> a[i] >> b[i];
dp[0][0] = true;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= b[i]; j++)
for (int k = 0; k + a[i] * j <= x; k++)
dp[i][k + a[i] * j] = dp[i - 1][k] || dp[i - 1][k + a[i] * j];
if (dp[n][x]) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <cstdio>
#include <vector>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
string s[305];
long long n, a[305], q, u, v;
long long inf = 0x3f3f3f3f3f3f3f3f;
long long d1[305][305], d2[305][305];
inline void bfs(int x) {
queue<int> q;
q.push(x);
d1[x][x] = 0, d2[x][x] = a[x];
while (!q.empty()) {
int t = q.front();
q.pop();
for (int i = 0; i < s[t].size(); i++)
if (s[t][i] == 'Y' && (d1[x][s[t][i]] == inf || (d1[x][s[t][i]] >
d1[x][t] && (d2[x][s[t][i]] < d2[x][t] + a[s[t][i]] || d2[x][s[t][i]] == inf)))) {
d1[x][s[t][i]] = d1[x][t] + 1;
d2[x][s[t][i]] = d2[x][t] + a[s[t][i]];
q.push(s[t][i]);
}
}
}
int main() {
memset(d1, inf, sizeof d1);
memset(d2, inf, sizeof d2);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> s[i];
for (int i = 1; i <= n; i++) bfs(i);
cin >> q;
for (int i = 1; i <= q; i++) {
cin >> u >> v;
cout << d1[u][v] << " " << d2[u][v] << endl;
}
return 0;
}