#include #include #include #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; int t; #define MAX 50002 vector s; vector op; char buf[3]; vector v[MAX][2]; int dp[MAX]; class S { int seg[MAX * 4]; int lazy[MAX * 4]; public: void update(int b) { if (b * 2 + 2 < MAX * 4) { lazy[b * 2 + 1] += lazy[b]; lazy[b * 2 + 2] += lazy[b]; } seg[b] += lazy[b]; lazy[b] = 0; } inline void add(int b, int l, int r, int ll, int rr, int x) { update(b); if (r <= ll || rr <= l) { return; } if (ll <= l&&r <= rr) { lazy[b] += x; update(b); return; } add(b * 2 + 1, l, (l + r) >> 1, ll, rr, x); add(b * 2 + 2, (l + r) >> 1, r, ll, rr, x); seg[b] = max(seg[b * 2 + 1], seg[b * 2 + 2]); } inline int q(int b, int l, int r, int ll, int rr) { update(b); if (r <= ll || rr <= l) { return 0; } if (ll <= l&&r <= rr) { return seg[b]; } int val = q(b * 2 + 1, l, (l + r) >> 1, ll, rr); val = max(val, q(b * 2 + 2, (l + r) >> 1, r, ll, rr)); return val; } void init() { memset(seg, 0, sizeof(seg)); memset(lazy, 0, sizeof(lazy)); } }; S seg[2]; int main() { cin >> t; while (t--) { int n; int m; cin >>m >> n; op.clear(); int base = m + 5; for (int i = 0; i < n; i++) { scanf("%s", buf); int ty = 0; if (buf[0] == 'D' || buf[0] == 'M') { ty = 1; } op.push_back(ty); } s.clear(); for (int i = 0; i < n; i++) { int a; scanf("%d", &a); a--; s.push_back(a); } for (int i = 0; i < m; i++) { for (int j = 0; j < 2; j++) { v[i][j].clear(); } } for (int i = 0; i < n; i++) { int a; scanf("%d", &a); a--; if (a > s[i]) { v[a][op[i]].push_back(s[i]); } } seg[0].init(); seg[1].init(); memset(dp,0,sizeof(dp)); for (int i = 1; i < m; i++) { dp[i] = max(dp[i], dp[i - 1]); for (int j = 0; j < 2; j++) { //my type for (int go : v[i][j]) { //from go to i-1 seg[j].add(0, 0, m, 0, go + 1, 1); } dp[i] = max(dp[i], seg[j].q(0, 0, m, 0, m)); } for (int j = 0; j < 2; j++) { seg[j].add(0, 0, m, i, i + 1, dp[i]); } } for (int i = 1; i <= n; i++) { int id = lower_bound(dp, dp + m, i) - dp; if (i > 1) { printf(" "); } if (id == m) { printf("-1"); } else { printf("%d", id + 1); } } puts(""); } return 0; }