rt,会不会是UB啊
#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
inline ll read() {
ll x = 0; bool op = 0;
char c = getchar();
while(!isdigit(c))op |= (c == '-'), c = getchar() ;
while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return op ? -x : x;
}
const int N = 50100;
const int Mod = 1e9 + 7;
int n, m, siz, maxi, id, tot;
int son[N][2], val[N], que[15];
ll a[15][N], dp[N][2], t[1 << 15];
char s[N];
int mod(ll x) {return x >= 0 ? x % Mod : x % Mod + Mod;}
bool cmp(int x, int y) {return a[x][id] < a[y][id];}
int build(int l, int r) {
if(l == r)return s[l] - '0' + 1;
if(s[r] == ')') {
int cnt = 1;
for(int i = r - 1; i >= l; i--) {
if(s[i] == ')')cnt++;
else if(s[i] == '(')cnt--;
if(cnt == 0) {
if(i == l)return build(l + 1, r - 1);
int cur = ++tot;
son[cur][0] = build(l, i - 2);
son[cur][1] = build(i + 1, r);
if(s[i - 1] == '<')val[cur] = 1;
else if(s[i - 1] == '>')val[cur] = 2;
else val[cur] = 0;
return cur;
}
}
}
else {
int cur = ++tot;
son[cur][0] = build(l, r - 2);
son[cur][1] = build(r, r);
if(s[r - 1] == '<')val[cur] = 1;
else if(s[r - 1] == '>')val[cur] = 2;
else val[cur] = 0;
return cur;
}
}
void dfs(int u, int i) {
int ls = son[u][0], rs = son[u][1];
if(ls == 0 && rs == 0) {
if((i >> (u - 1) & 1) == 0)dp[u][1] = 1, dp[u][0] = 0;
else dp[u][0] = 1, dp[u][1] = 0;
return ;
}
dfs(ls, i); dfs(rs, i);
for(int k = 0; k <= 1; k++) {
ll res1 = 0, res2 = 0;
for(int p = 0; p <= 1; p++) {
for(int q = 0; q <= 1; q++) {
if(min(p, q) == k)
res1 = mod(res1 + mod(dp[ls][p] * dp[rs][q]));
if(max(p, q) == k)
res2 = mod(res2 + mod(dp[ls][p] * dp[rs][q]));
}
}
if(val[u] == 1)dp[u][k] = res1;
else if(val[u] == 2)dp[u][k] = res2;
else dp[u][k] = mod(res1 + res2);
}
return ;
}
int main() {
n = read(); m = read(); maxi = (1 << m) - 1;
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
a[i][j] = read();
}
}
scanf("%s", s + 1); siz = strlen(s + 1);
tot = m;
int rt = build(1, siz);
for(int i = 0; i <= maxi; i++) {
memset(dp, 0, sizeof(dp));
dfs(rt, i); t[i] = dp[rt][1];
}
ll ans = 0;
for(int i = 1; i <= n; i++) {
id = i;
for(int j = 1; j <= m; j++)que[j] = j;
sort(que + 1, que + m + 1, cmp);
int S = 0;
for(int j = 1; j <= m; j++) {
ans = mod(ans + mod((a[que[j]][i] - a[que[j - 1]][i]) * t[S]));
S ^= (1 << (que[j] - 1));
}
}
printf("%lld", ans);
return 0;
}