#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sstream>
#pragma GCC optimize(2)
typedef long long ll;
using namespace std;
const int Mod = 1e9 + 7;
struct Node {
Node* left;
Node* right;
string item;
Node() : left(nullptr), right(nullptr), item("") {}
};
bool isOp(string s) {
return (s == "*") || (s == "-") || (s == "+");
}
void dfs(Node* root, vector<string>& items, int& cnt) {
if (cnt < 0) {
return;
}
string tmp = items[cnt];
root -> item = tmp;
cnt--;
if (!isOp(tmp)) {
return;
}
root->left = new Node(); root->right = new Node();
dfs(root->right, items, cnt);
dfs(root->left, items, cnt);
}
Node* build(vector<string> items) {
Node* root = new Node();
int cnt = items.size()-1;
dfs(root, items, cnt);
return root;
}
ll cal(Node* root, map<string, ll>& value) {
if (root->item == "*") {
return (cal(root->left, value)%Mod * cal(root->right, value)%Mod)%Mod;
} else if (root->item == "-") {
return (cal(root->left, value)%Mod - cal(root->right, value)%Mod)%Mod;
} else if (root->item == "+") {
return (cal(root->left, value)%Mod + cal(root->right, value)%Mod)%Mod;
} else if (root->item[0] == 'x') {
return value[root->item]%Mod;
} else {
return stoi(root->item)%Mod;
}
return 0;
}
ll p_cal(Node* root, map<string, ll>& p_value, map<string, ll>& value) {
if (root->item == "*") {
return (p_cal(root->left, p_value, value)%Mod * cal(root->right, value)%Mod +
p_cal(root->right, p_value, value)%Mod * cal(root->left, value)%Mod)%Mod;
} else if (root->item == "-") {
return (p_cal(root->left, p_value, value)%Mod - p_cal(root->right, p_value, value)%Mod)%Mod;
} else if (root->item == "+") {
return (p_cal(root->left, p_value, value)%Mod + p_cal(root->right, p_value, value)%Mod)%Mod;
} else if (root->item[0] == 'x') {
return p_value[root->item]%Mod;
} else {
return 0;
}
return 0;
}
int main () {
int n, m; cin >> n >> m; getchar();
string line, token;
getline(cin, line);
istringstream iss(line);
vector<string> items;
while (iss >> token) items.push_back(token);
Node* root = build(items);
for (int i = 0; i < m; ++i) {
int x; cin >> x;
map<string, ll> value;
map<string, ll> p_value;
for (int i = 1; i <= n; ++i) {
string str = "x" + to_string(i);
int val; cin >> val;
value[str] = val;
if (i == x) p_value[str] = 1;
else p_value[str] = 0;
}
cout << (p_cal(root, p_value, value) + Mod)%Mod << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3N0cmVhbT4KI3ByYWdtYSBHQ0Mgb3B0aW1pemUoMikKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBNb2QgPSAxZTkgKyA3OwpzdHJ1Y3QgTm9kZSB7CiAgICBOb2RlKiBsZWZ0OwogICAgTm9kZSogcmlnaHQ7CiAgICBzdHJpbmcgaXRlbTsKICAgIE5vZGUoKSA6IGxlZnQobnVsbHB0ciksIHJpZ2h0KG51bGxwdHIpLCBpdGVtKCIiKSB7fQp9Owpib29sIGlzT3Aoc3RyaW5nIHMpIHsKICAgIHJldHVybiAocyA9PSAiKiIpIHx8IChzID09ICItIikgfHwgKHMgPT0gIisiKTsKfQp2b2lkIGRmcyhOb2RlKiByb290LCB2ZWN0b3I8c3RyaW5nPiYgaXRlbXMsIGludCYgY250KSB7CiAgICBpZiAoY250IDwgMCkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHN0cmluZyB0bXAgPSBpdGVtc1tjbnRdOwogICAgcm9vdCAtPiBpdGVtID0gdG1wOwogICAgY250LS07CiAgICBpZiAoIWlzT3AodG1wKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJvb3QtPmxlZnQgPSBuZXcgTm9kZSgpOyByb290LT5yaWdodCA9IG5ldyBOb2RlKCk7CiAgICBkZnMocm9vdC0+cmlnaHQsIGl0ZW1zLCBjbnQpOwogICAgZGZzKHJvb3QtPmxlZnQsIGl0ZW1zLCBjbnQpOwp9Ck5vZGUqIGJ1aWxkKHZlY3RvcjxzdHJpbmc+IGl0ZW1zKSB7CiAgICBOb2RlKiByb290ID0gbmV3IE5vZGUoKTsKICAgIGludCBjbnQgPSBpdGVtcy5zaXplKCktMTsKICAgIGRmcyhyb290LCBpdGVtcywgY250KTsKICAgIHJldHVybiByb290Owp9CmxsIGNhbChOb2RlKiByb290LCBtYXA8c3RyaW5nLCBsbD4mIHZhbHVlKSB7CiAgICBpZiAocm9vdC0+aXRlbSA9PSAiKiIpIHsKICAgICAgICByZXR1cm4gKGNhbChyb290LT5sZWZ0LCB2YWx1ZSklTW9kICogY2FsKHJvb3QtPnJpZ2h0LCB2YWx1ZSklTW9kKSVNb2Q7CiAgICB9IGVsc2UgaWYgKHJvb3QtPml0ZW0gPT0gIi0iKSB7CiAgICAgICAgcmV0dXJuIChjYWwocm9vdC0+bGVmdCwgdmFsdWUpJU1vZCAtIGNhbChyb290LT5yaWdodCwgdmFsdWUpJU1vZCklTW9kOwogICAgfSBlbHNlIGlmIChyb290LT5pdGVtID09ICIrIikgewogICAgICAgIHJldHVybiAoY2FsKHJvb3QtPmxlZnQsIHZhbHVlKSVNb2QgKyBjYWwocm9vdC0+cmlnaHQsIHZhbHVlKSVNb2QpJU1vZDsKICAgIH0gZWxzZSBpZiAocm9vdC0+aXRlbVswXSA9PSAneCcpIHsKICAgICAgICByZXR1cm4gdmFsdWVbcm9vdC0+aXRlbV0lTW9kOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc3RvaShyb290LT5pdGVtKSVNb2Q7CiAgICB9CiAgICByZXR1cm4gMDsKfQpsbCBwX2NhbChOb2RlKiByb290LCBtYXA8c3RyaW5nLCBsbD4mIHBfdmFsdWUsIG1hcDxzdHJpbmcsIGxsPiYgdmFsdWUpIHsKICAgIGlmIChyb290LT5pdGVtID09ICIqIikgewogICAgICAgIHJldHVybiAocF9jYWwocm9vdC0+bGVmdCwgcF92YWx1ZSwgdmFsdWUpJU1vZCAqIGNhbChyb290LT5yaWdodCwgdmFsdWUpJU1vZCArCiAgICAgICAgcF9jYWwocm9vdC0+cmlnaHQsIHBfdmFsdWUsIHZhbHVlKSVNb2QgKiBjYWwocm9vdC0+bGVmdCwgdmFsdWUpJU1vZCklTW9kOwogICAgfSBlbHNlIGlmIChyb290LT5pdGVtID09ICItIikgewogICAgICAgIHJldHVybiAocF9jYWwocm9vdC0+bGVmdCwgcF92YWx1ZSwgdmFsdWUpJU1vZCAtIHBfY2FsKHJvb3QtPnJpZ2h0LCBwX3ZhbHVlLCB2YWx1ZSklTW9kKSVNb2Q7CiAgICB9IGVsc2UgaWYgKHJvb3QtPml0ZW0gPT0gIisiKSB7CiAgICAgICAgcmV0dXJuIChwX2NhbChyb290LT5sZWZ0LCBwX3ZhbHVlLCB2YWx1ZSklTW9kICsgcF9jYWwocm9vdC0+cmlnaHQsIHBfdmFsdWUsIHZhbHVlKSVNb2QpJU1vZDsKICAgIH0gZWxzZSBpZiAocm9vdC0+aXRlbVswXSA9PSAneCcpIHsKICAgICAgICByZXR1cm4gcF92YWx1ZVtyb290LT5pdGVtXSVNb2Q7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIDA7Cn0KaW50IG1haW4gKCkgewogICAgaW50IG4sIG07IGNpbiA+PiBuID4+IG07IGdldGNoYXIoKTsKICAgIHN0cmluZyBsaW5lLCB0b2tlbjsKICAgIGdldGxpbmUoY2luLCBsaW5lKTsKICAgIGlzdHJpbmdzdHJlYW0gaXNzKGxpbmUpOwogICAgdmVjdG9yPHN0cmluZz4gaXRlbXM7CiAgICB3aGlsZSAoaXNzID4+IHRva2VuKSBpdGVtcy5wdXNoX2JhY2sodG9rZW4pOwogICAgTm9kZSogcm9vdCA9IGJ1aWxkKGl0ZW1zKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgICAgaW50IHg7IGNpbiA+PiB4OwogICAgICAgIG1hcDxzdHJpbmcsIGxsPiB2YWx1ZTsKICAgICAgICBtYXA8c3RyaW5nLCBsbD4gcF92YWx1ZTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICAgICAgc3RyaW5nIHN0ciA9ICJ4IiArIHRvX3N0cmluZyhpKTsKICAgICAgICAgICAgaW50IHZhbDsgY2luID4+IHZhbDsKICAgICAgICAgICAgdmFsdWVbc3RyXSA9IHZhbDsKICAgICAgICAgICAgaWYgKGkgPT0geCkgcF92YWx1ZVtzdHJdID0gMTsKICAgICAgICAgICAgZWxzZSBwX3ZhbHVlW3N0cl0gPSAwOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IChwX2NhbChyb290LCBwX3ZhbHVlLCB2YWx1ZSkgKyBNb2QpJU1vZCA8PCBlbmRsOwogICAgfQogICAgcmV0dXJuIDA7Cn0=