#include using namespace std; #define MOD 1000000007 #define ll long long int #define ld long double #define pb push_back #define mkp make_pair #define pii pair #define pll pair #define sci(x) scanf("%d", &x) #define scl(x) scanf("%lld", &x) #define fi first #define sc second #define deb 0 int T1[50004], S[50004], D[50004], DP[50004], ANS[50004]; map mp; int T[2][2000001], L[2][2000001]; int BIT[2][50004]; vector E[50004]; void make(int id, int n, int start, int end) { if (start == end) { T[id][n] = 0; L[id][n] = 0; return; } int mid = (start + end) >> 1; make(id, n<<1, start, mid); make(id, n<<1|1, mid+1, end); T[id][n] = 0; L[id][n] = 0; } void insert(int id, int n, int start, int end, int x, int y) { if (L[id][n]) { T[id][n] += L[id][n]; if (start != end) { L[id][n<<1] += L[id][n]; L[id][n<<1|1] += L[id][n]; } L[id][n] = 0; } if (start > end || start > x || end < x) return; if (start == x && end == x) { T[id][n] = max(T[id][n], y); return; } int mid = (start + end) >> 1; insert(id, n<<1, start, mid, x, y); insert(id, n<<1|1, mid+1, end, x, y); T[id][n] = max(T[id][n<<1], T[id][n<<1|1]); } void update(int id, int n, int start, int end, int l, int r) { if (L[id][n]) { T[id][n] += L[id][n]; if (start != end) { L[id][n<<1] += L[id][n]; L[id][n<<1|1] += L[id][n]; } L[id][n] = 0; } if (start > end || start > r || end < l) return; if (start >= l && end <= r) { T[id][n] += 1; if (start != end) { L[id][n<<1] += 1; L[id][n<<1|1] += 1; } return; } int mid = (start + end) >> 1; update(id, n<<1, start, mid, l, r); update(id, n<<1|1, mid+1, end, l, r); T[id][n] = max(T[id][n<<1], T[id][n<<1|1]); } int query(int id, int n, int start, int end, int l, int r) { if (L[id][n]) { T[id][n] += L[id][n]; if (start != end) { L[id][n<<1] += L[id][n]; L[id][n<<1|1] += L[id][n]; } L[id][n] = 0; } if (start > end || start > r || end < l) return 0; if (start >= l && end <= r) return T[id][n]; int mid = (start + end) >> 1; return max(query(id, n<<1, start, mid, l, r), query(id, n<<1|1, mid+1, end, l, r)); } void insert(int id, int x) { for (; x <= 50000; x += (x&-x)) BIT[id][x] += 1; } int query(int id, int x) { int ret = 0; for (; x > 0; x -= (x&-x)) ret += BIT[id][x]; return ret; } void solve() { int m, n, i, j, k, x, y, z; cin >> m >> n; string s; for (i = 0; i < n; ++i) { cin >> s; T1[i] = mp[s]; } for (i = 0; i < n; ++i) cin >> S[i]; for (i = 0; i < n; ++i) cin >> D[i]; for (i = 1; i <= m; ++i) E[i].clear(); for (i = 0; i < n; ++i) { if (S[i] < D[i]) { E[D[i]].pb(mkp(S[i], T1[i])); } } memset(DP, 0, sizeof(DP)); for (i = 1; i <= m; ++i) ANS[i] = MOD; make(0, 1, 1, m); make(1, 1, 1, m); for (i = 1; i <= m; ++i) { for (auto it: E[i]) { update(it.sc, 1, 1, m, 1, it.fi); } int a = query(0, 1, 1, m, 1, i-1); int b = query(1, 1, 1, m, 1, i-1); DP[i] = max(DP[i], max(a, b)); insert(0, 1, 1, m, i, DP[i]); insert(1, 1, 1, m, i, DP[i]); } for (i = 1; i <= n; ++i) { int x = lower_bound(DP+1, DP+m+1, i) - DP; if (x > m) ANS[i] = -1; else ANS[i] = x; } for (i = 1; i <= n; ++i) cout << ANS[i] << " "; cout << endl; } int main() { ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0); mp["E"] = 0; mp["C"] = 0; mp["M"] = 1; mp["D"] = 1; int t; cin >> t; while (t--) { solve(); } return 0; }