#include using namespace std; #define MAXN 50010 #define INF 0x3f3f3f3f #define mo 1000000007 typedef long long LL; int n, m, s[MAXN], t[MAXN]; int tree[2][MAXN * 4]; int lazy[2][MAXN * 4]; int ans[MAXN]; char ani[MAXN]; struct ANIMAL{ int l, r, type; }p[MAXN]; void Init() { scanf("%d %d", &n, &m); for(int i = 1; i <= m; ++i) scanf(" %c", ani + i); for(int i = 1; i <= m; ++i) scanf("%d", s + i); for(int i = 1; i <= m; ++i) scanf("%d", t + i); } void Update(int i) { for(int k = 0; k < 2; ++k){ if(lazy[k][i]){ lazy[k][i << 1] += lazy[k][i]; tree[k][i << 1] += lazy[k][i]; lazy[k][(i << 1) | 1] += lazy[k][i]; tree[k][(i << 1) | 1] += lazy[k][i]; } lazy[k][i] = 0; } } void Build(int i, int l, int r) { tree[0][i] = tree[1][i] = 0; lazy[0][i] = lazy[1][i] = 0; if(l == r) return; int mid = (l + r) >> 1; Build(i << 1, l, mid); Build((i << 1) | 1, mid + 1, r); } void Modify1(int i, int l, int r, int pi, int f0, int f1) { if(l == r){ tree[0][i] = max(tree[0][i], f0); tree[1][i] = max(tree[1][i], f1); return; } int mid = (l + r) >> 1; Update(i); if(pi <= mid) Modify1(i << 1, l, mid, pi, f0, f1); else Modify1((i << 1) | 1, mid + 1, r, pi, f0, f1); tree[0][i] = max(tree[0][i << 1], tree[0][(i << 1) | 1]); tree[1][i] = max(tree[1][i << 1], tree[1][(i << 1) | 1]); } void Modify2(int i, int l, int r, int s, int t, int k) { if(s <= l && r <= t){ ++lazy[k][i]; ++tree[k][i]; return; } int mid = (l + r) >> 1; Update(i); if(l <= t && mid >= s) Modify2(i << 1, l, mid, s, t, k); if(mid < t && r >= s) Modify2((i << 1) | 1, mid + 1, r, s, t, k); tree[0][i] = max(tree[0][i << 1], tree[0][(i << 1) | 1]); tree[1][i] = max(tree[1][i << 1], tree[1][(i << 1) | 1]); } pair Query(int i, int l, int r, int s, int t) { if(s <= l && r <= t) return {tree[0][i], tree[1][i]}; int mid = (l + r) >> 1; Update(i); pair res1{0, 0}, res2{0, 0}; if(l <= t && mid >= s) res1 = Query(i << 1, l, mid, s, t); if(mid < t && r >= s) res2 = Query((i << 1) | 1, mid + 1, r, s, t); return {max(res1.first, res2.first), max(res1.second, res2.second)}; } void Work() { memset(ans, 0x3f, sizeof(ans)); int i, j; for(i = 1; i <= m; ++i){ p[i].l = s[i]; p[i].r = t[i]; p[i].type = (ani[i] == 'D' || ani[i] == 'M') ? 1 : 0; } sort(p + 1, p + 1 + m, [](const ANIMAL &a, const ANIMAL &b){ return a.r < b.r; }); for(i = 1, j = 1; i <= n; ++i){ for(;j <= m && p[j].r == i; ++j) if(p[j].l < p[j].r) Modify2(1, 1, n, 1, p[j].l, p[j].type); auto ret = Query(1, 1, n, 1, i - 1); int x = max(ret.first, ret.second); Modify1(1, 1, n, i, x, x); ans[x] = min(ans[x], i); } for(i = m; i; --i) ans[i] = min(ans[i], ans[i + 1]); for(i = 1; i <= m; ++i) printf("%d ", ans[i] == INF ? -1 : ans[i]); printf("\n"); } int main() { #ifdef MYCP freopen("data.in", "r", stdin); #endif // MYCP int T; for(scanf("%d", &T); T; --T){ Init(); Build(1, 1, n); Work(); } return 0; }