#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+7;
int a[102];
void solve(string str,int n){
int num;
cin>>num;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]=(a[i]+mod)%mod;
}
stack< map<ll,ll> >stk;
istringstream istr(str);
string out;
while(istr>>out){
if(out=="+"||out=="-"||out=="*"){
auto y=stk.top();stk.pop();
auto x=stk.top();stk.pop();
map<ll,ll>res;
if(out=="+"){
for(auto c:x)res[c.first]=c.second;
for(auto c:y)res[c.first]=(res[c.first]+c.second)%mod;
}
else if(out=="-"){
for(auto c:x)res[c.first]=c.second;
for(auto c:y)res[c.first]=(res[c.first]-c.second+mod)%mod;
}
else {
for(auto c1:x){
for(auto c2:y){
res[c1.first+c2.first]+=c1.second*c2.second%mod;
res[c1.first+c2.first]%=mod;
}
}
}
stk.push(res);
}
else if(out[0]=='x'){
int c=atoi(out.substr(1).c_str());
map<ll,ll>res;
if(num==c){
res[1]=1;
}
else {
res[0]=a[c];
}
stk.push(res);
}
else {
int c=atoi(out.c_str());
c=(c+mod)%mod;
map<ll,ll>res;
res[0]=c;
stk.push(res);
}
}
auto t=stk.top();
ll res=0;
for(auto c:t){
ll tmp=c.second*c.first%mod;
for(int i=1;i<=c.first-1;i++)tmp=tmp*a[num]%mod;
res=(res+tmp)%mod;
}
cout<<res<<endl;
}
int main(){
// freopen("1.txt","r",stdin);
int n,m;
cin>>n>>m;
getchar();
string str;
getline(cin,str);
while(m--){
solve(str,n);
}
return 0;
}
考察了多项式表示和求解,用map表示更省空间