#include #include #include #include #include #include #include #include #include #include #define INF 1000000000 #define MAXN 50005 using namespace std; int getind(char c) { if (c == 'E') return 0; if (c == 'D') return 1; if (c == 'C') return 2; return 3; } vector ga[MAXN], gb[MAXN]; int ans[MAXN], a[MAXN]; int st[MAXN]; int dp[MAXN]; int m, n; bool cmp(int x, int y) { if (st[x] == st[y]) return x < y; return st[x] < st[y]; } int b[MAXN][4]; int lowbit(int x) { return x & -x; } void modify(int x, int v, int j) { for(int i = x; i >= 1; i -= lowbit(i)) b[i][j] += v; } int get_sum(int x, int j) { int sum = 0; for(int i = x; i <= m; i += lowbit(i)) sum += b[i][j]; return sum; } int main() { int t; cin >> t; while (t--) { memset(ans, -1, sizeof(ans)); memset(dp, 0, sizeof(dp)); memset(b, 0, sizeof(b)); cin >> m >> n; char ss[5]; for (int i = 1; i <= n; i++) { cin >> ss; a[i] = getind(ss[0]); } for (int i = 1; i <= n; i++) { cin >> st[i]; } for (int i = 1; i <= m; i++) ga[i].clear(), gb[i].clear(); for (int i = 1; i <= n; i++) { int x; cin >> x; if (a[i] == 0 || a[i] == 2) ga[x].push_back(i); else gb[x].push_back(i); } for (int i = 1; i <= m; i++) { dp[i] = dp[i - 1]; if (ga[i].size() == 0 && gb[i].size() == 0) continue; if (ga[i].size() > 0) { sort(ga[i].begin(), ga[i].end(), cmp); for (int j = 0; j < ga[i].size(); j++) { int si = st[ga[i][j]]; int cnt = get_sum(si, 0) + get_sum(si, 2); dp[i] = max(dp[i], dp[si] + cnt + (int)ga[i].size() - j); } for (int j = 0; j < ga[i].size(); j++) { int si = st[ga[i][j]]; modify(si, 1, a[si]); } } if (gb[i].size() > 0) { sort(gb[i].begin(), gb[i].end(), cmp); for (int j = 0; j < gb[i].size(); j++) { int si = st[gb[i][j]]; int cnt = get_sum(si, 1) + get_sum(si, 3); dp[i] = max(dp[i], dp[si] + cnt + (int)gb[i].size() - j); } for (int j = 0; j < gb[i].size(); j++) { int si = st[gb[i][j]]; modify(si, 1, a[si]); } } } int now = 0; for (int i = 1; i <= m; i++) { if (dp[i] > now) { for (int j = now + 1; j <= dp[i]; j++) { ans[j] = i; } now = dp[i]; } } for (int i = 1; i <= n; i++) { printf("%d", ans[i]); if (i < n) printf(" "); } printf("\n"); } return 0; }