/* ID: usaco.t3 TASK: test LANG: C++14 */ #pragma GCC optimize ("O3") /****Author: Barish Namazov****/ #include using namespace std; /***TEMPLATE***/ #define intt long long #define pii pair #define vi vector #define vii vector #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define F first #define S second #define pb push_back #define IO ios_base::sync_with_stdio(false);cin.tie(); #define endl '\n' #define wtfis(x) cerr << "at line " << __LINE__ << ": " << #x << " = " << (x) << endl const intt max3 = 1003; const intt max4 = 10004; const intt maxx = 100005; const intt max6 = 1000006; const intt max7 = 10000007; const intt lg4 = 13; const intt lg5 = 17; const intt lg6 = 20; const intt INF = 2LL * 1000000000; const intt INFLL = 9LL * 1000000000 * 1000000000; /***************/ intt powmod (intt a, intt b, intt mod) { intt res = 1; a %= mod; for (; b; b >>= 1) { if (b & 1) res = (res * a) % mod; a = (a * a) % mod; } return res; } intt gcd (intt a, intt b) { while (b > 0) { intt t = a % b; a = b, b = t; } return a; } intt lcm (intt a, intt b) { return (a / gcd (a, b)) * b; } intt is_prime (intt n) { if (n <= 1 || n > 3 && (n % 2 == 0 || n % 3 == 0)) return 0; for (intt i = 5, t = 2; i * i <= n; i += t, t = 6 - t) if (n % i == 0) return 0; return 1; } /**************************/ intt n, m; char t[maxx]; intt s[maxx]; intt dp[2][maxx], mx[maxx]; struct segtree { intt t[maxx << 2], lazy[maxx << 2]; void relax (intt v, intt l, intt r) { t[v] += lazy[v]; if (l != r) lazy[v << 1] += lazy[v], lazy[v << 1 | 1] += lazy[v]; lazy[v] = 0; } void build (intt v, intt l, intt r) { if (l == r) { //t[v] = arr[r]; return; } intt mid = (l + r) >> 1; build (v << 1, l, mid); build (v << 1 | 1, mid + 1, r); t[v] = max (t[v << 1], t[v << 1 | 1]); } void update (intt v, intt l, intt r, intt i, intt j, intt val) { if (lazy[v] != 0) relax (v, l, r); if (j < l || i > r) return; if (i <= l && r <= j) { lazy[v] += val; relax (v, l, r); return; } intt mid = (l + r) >> 1; update (v << 1, l, mid, i, j, val); update (v << 1 | 1, mid + 1, r, i, j, val); t[v] = max (t[v << 1], t[v << 1 | 1]); } intt query (intt v, intt l, intt r, intt i, intt j) { if (j < l || i > r) return 0; if (lazy[v] != 0) relax (v, l, r); if (i <= l && r <= j) return t[v]; intt mid = (l + r) >> 1; return max (query (v << 1, l, mid, i, j), query (v << 1 | 1, mid + 1, r, i, j)); } }; segtree T1, T2; int main() { intt T; cin >> T; while (T --) { cin >> m >> n; for (intt i = 1; i <= n; i++) { cin >> t[i]; } for (intt i = 1; i <= n; i++) { cin >> s[i]; } intt a; vector < pair > g[maxx]; for (intt i = 1; i <= n; i++) { cin >> a; if (s[i] < a) { g[a].pb ({t[i], s[i]}); } } /* for (intt i = 1; i <= n; i++) { for (intt j = 0; j < g[i].size(); j++) { cout << g[i][j] << " "; } cout << endl; } */ for (intt i = 1; i <= m; i++) { for (intt j = 0; j < g[i].size(); j++) { pii x = g[i][j]; if (x.F == 'D' || x.F == 'M') { T1.update (1, 1, m, 1, x.S, 1); } else { T2.update (1, 1, m, 1, x.S, 1); } } dp[0][i] = T1.query (1, 1, m, 1, i); dp[1][i] = T2.query (1, 1, m, 1, i); mx[i] = max (dp[0][i], dp[1][i]); //cout << T1.query (1, 1, m, i, i) << " " << T2.query(1, 1, m, i, i) << endl; T1.update (1, 1, m, i, i, dp[1][i]); /// cross update T2.update (1, 1, m, i, i, dp[0][i]); //cout << T1.query (1, 1, m, i, i) << " " << T2.query(1, 1, m, i, i) << endl; } /* for (intt i = 1; i <= n; i++) { cout << T1.query (1, 1, m, i, i) << " " << T2.query(1, 1, m, i, i) << endl; } */ intt res = 1; for (intt i = 1; i <= n; i++) { while (res <= m && mx[res] < i) { res++; } if (res > m) { cout << -1 << " "; } else { cout << res << " "; } } cout << endl; memset (T1.t, 0, sizeof (T1.t)); memset (T2.t, 0, sizeof (T2.t)); memset (T1.lazy, 0, sizeof (T1.lazy)); memset (T2.lazy, 0, sizeof (T2.lazy)); } return 0; }