#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define PI 3.14159265359 #define all(v) v.begin(),v.end() #define sortva(v) sort(all(v)) #define sortvd(v) sort(v.rbegin(),v.rend()) #define sortaa(a,n) sort(a,a+n) #define sortad(a,n) sort(a,a+n),reverse(a,a+n) #define sfi1(v) scanf("%d",&v) #define sfi2(v1,v2) scanf("%d %d",&v1,&v2) #define sfi3(v1,v2,v3) scanf("%d %d %d",&v1,&v2,&v3) #define sfll1(v) scanf("%I64d",&v); #define sfll2(v1,v2) scanf("%I64d %I64d",&v1,&v2) #define sfll3(v1,v2,v3) scanf("%I64d %I64d %I64d",&v1,&v2,&v3) #define sfstr(v) scanf("%s", v); #define sz(v) (int)v.size() #define ndl puts("") #define SS stringstream typedef long long ll; typedef unsigned long long ull; typedef long double ld; int dx[] = { 0, 0, 1, -1, 1, -1, 1, -1 }; int dy[] = { 1, -1, 0, 0, -1, 1, 1, -1 }; ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); } ll lcm(ll a, ll b) { return (a / gcd(a, b)) * b; } void PLAY() { //#ifndef ONLINE_JUDGE // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); //#endif cout << fixed << setprecision(10); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); } vector pick_me[5][50005]; char ty[50005]; int s[50005], d[50005]; int vis[50005]; void clear() { memset(vis, 0, sizeof vis); for (int i = 0; i < 5; i++) for (int j = 0; j < 50005; j++) pick_me[i][j].clear(); } int idx(char ch) { if (ch == 'E') return 0; if (ch == 'D') return 1; if (ch == 'C') return 2; return 3; } int main() { PLAY(); int t; cin >> t; while (t--) { clear(); int m, n; cin >> m >> n; for (int i = 0; i < n; i++) cin >> ty[i]; for (int i = 0; i < n; i++) cin >> s[i]; for (int i = 0; i < n; i++) cin >> d[i]; for (int i = 0; i < n; i++) pick_me[idx(ty[i])][s[i]].push_back(d[i]); vector cnt(m + 1, INT_MIN); // {{cur_animals, cur_node}} // descending order priority_queue> qu; cnt[1] = 0; qu.push({ 0, 1 }); while (sz(qu)) { int cur_node = qu.top().second; int cur_cost = qu.top().first; qu.pop(); if (vis[cur_node]) continue; vis[cur_node] = true; // 0 1 2 3 if (cur_node + 1 <= m) qu.push({ cur_cost, cur_node + 1 }); // E D C M vector E = pick_me[0][cur_node]; vector D = pick_me[1][cur_node]; vector C = pick_me[2][cur_node]; vector M = pick_me[3][cur_node]; vector EC(sz(E) + sz(C)); for (int i = 0; i < sz(E); i++) EC[i] = E[i]; for (int i = 0; i < sz(C); i++) EC[i + sz(E)] = C[i]; sortva(EC); int cur_cnt = 0; for (int i = 0; i < sz(EC); i++) { cur_cnt++; if (cnt[EC[i]] < cur_cnt + cur_cost) { cnt[EC[i]] = cur_cnt + cur_cost; qu.push({ cur_cnt + cur_cost, EC[i] }); } } vector MD(sz(M) + sz(D)); for (int i = 0; i < sz(M); i++) MD[i] = M[i]; for (int i = 0; i < sz(D); i++) MD[i + sz(M)] = D[i]; sortva(MD); cur_cnt = 0; for (int i = 0; i < sz(MD); i++) { cur_cnt++; if (cnt[MD[i]] < cur_cnt + cur_cost) { cnt[MD[i]] = cur_cnt + cur_cost; qu.push({ cur_cnt + cur_cost, MD[i] }); } } } for (int i = 0; i <= m; i++) if (cnt[i] == INT_MIN) cnt[i] = 0; for (int i = 0; i <= m; i++){ if (cnt[i]) { int j = i + 1; while (j <= m && cnt[j] <= cnt[i]) { cnt[j] = cnt[i]; j++; } i = j - 1; } } vector::iterator it; for (int i = 1; i <= n; i++) { it = lower_bound(all(cnt), i); if (it == cnt.end()) cout << -1 << " "; else cout << it - cnt.begin() << " "; } cout << "\n"; } return 0; }