// author: gary #include using namespace std; #define ALL(x) (x).begin(), (x).end() #define SZ(x) ( (int) (x).size() ) #define DBG(x) do { std::cerr << #x << ": " << x << std::endl; } while (0) typedef pair pii; typedef long long ll; template bool cmax(T& a, T b) { if(a < b) { a = b; return true; } return false; } template bool cmin(T& a, T b) { if(a > b) { a = b; return true; } return false; } const int MAX_N = 5e4 + 10; const int INF = 1e9; struct MaxSegmentTree { int lazy[MAX_N * 4]; int T[MAX_N * 4]; int n; void init(int _n){ memset(lazy, 0, sizeof lazy); memset(T, 0, sizeof T); n = _n; } void propagate(int n, int L, int R){ T[n] += lazy[n]; if(L != R){ lazy[n * 2] += lazy[n]; lazy[n * 2 + 1] += lazy[n]; } lazy[n] = 0; } void update(int n, int L, int R, int i, int j, ll x){ propagate(n, L, R); if(R < i || j < L) return; if(i <= L && R <= j){ lazy[n] = x; propagate(n, L, R); } else { update(n * 2, L, (L + R) / 2, i, j, x); update(n * 2 + 1, (L + R) / 2 + 1, R, i, j, x); T[n] = max(T[n * 2], T[n * 2 + 1]); } } void update(int i, int j, ll x){ if(i <= j) update(1, 1, n, i, j, x); } int query(int n, int L, int R, int i, int j){ if(R < i || j < L) return -INF; propagate(n, L, R); if(i <= L && R <= j) return T[n]; return max(query(n * 2, L, (L + R) / 2, i, j), query(n * 2 + 1, (L + R) / 2 + 1, R, i, j)); } int query(int i, int j){ if(i > j) return -INF; return query(1, 1, n, i, j); } } t[2]; int type[MAX_N]; int spos[MAX_N]; int tpos[MAX_N]; int dp[MAX_N]; vector ani[MAX_N]; void solve() { int nzoos, nanimals; char buf[3]; scanf("%d%d", &nzoos, &nanimals); for(int i = 1; i <= nzoos; i++) ani[i].clear(); t[0].init(nzoos), t[1].init(nzoos); for(int i = 0; i < nanimals; i++) { scanf("%s", buf); type[i] = buf[0] == 'D' || buf[0] == 'M'; } for(int i = 0; i < nanimals; i++) scanf("%d", spos + i); for(int i = 0; i < nanimals; i++) scanf("%d", tpos + i); for(int i = 0; i < nanimals; i++) { if(spos[i] < tpos[i]) ani[tpos[i]].push_back(i); } dp[0] = 0; for(int i = 1; i <= nzoos; i++) { dp[i] = dp[i - 1]; for(int j: ani[i]) t[type[j]].update(1, spos[j], 1); for(int j = 0; j < 2; j++) cmax(dp[i], t[j].query(1, i - 1)); for(int j = 0; j < 2; j++) t[j].update(i, i, dp[i]); } // printf("dp: "); for(int i = 1; i <= nzoos; i++) { printf("%d ", dp[i]); } puts(""); for(int i = 1; i <= nanimals; i++) { int j = lower_bound(dp, dp + nzoos + 1, i) - dp; if(j > nzoos) j = -1; if(i > 1) putchar(' '); printf("%d", j); } puts(""); } int main() { int test; scanf("%d", &test); while(test--) { solve(); } return 0; }