#include using namespace std; #define sd(x) scanf("%d", &(x)) #define ll long long #define pii pair #define piii pair #define F first #define S second #define pb push_back const int N = 500005; int dp[2][N], dp2[2][N], source[N], dest[N], dp3[N], cnt; vector con[2][N]; char type[N]; int tree[2][N << 2], lazy[2][N << 2]; void go(int bit, int s, int e, int ind){ tree[bit][ind] += lazy[bit][ind]; if(s != e){ lazy[bit][ind << 1] += lazy[bit][ind]; lazy[bit][ind << 1 | 1] += lazy[bit][ind]; } lazy[bit][ind] = 0; } int n, m; void update(int bit, int l, int r, int x, int s = 1, int e = m, int ind = 1){ go(bit, s, e, ind); if(l > e || s > r) return; if(s >= l && e <= r){ lazy[bit][ind] += x; go(bit, s, e, ind); return; } int mid = (s + e) >> 1; update(bit, l, r, x, s, mid, ind << 1); update(bit, l, r, x, mid + 1, e, ind << 1 | 1); tree[bit][ind] = max(tree[bit][ind << 1], tree[bit][ind << 1 | 1]); } int get(int bit, int l, int r, int s = 1, int e = m, int ind = 1){ go(bit, s, e, ind); if(l > e || s > r) return 0; if(s >= l && e <= r) return tree[bit][ind]; int mid = (s + e) >> 1; return max(get(bit, l, r, s, mid, ind << 1), get(bit, l, r, mid + 1, e, ind << 1 | 1)); } int main(){ int t; cin >> t; while(t--){ memset(dp, 0, sizeof dp); memset(dp2, 0, sizeof dp2); memset(tree, 0, sizeof tree); memset(lazy, 0, sizeof lazy); cin >> m >> n; for(int i = 1; i <= m; i++) con[0][i].clear(), con[1][i].clear(); for(int i = 1; i <= n; i++){ cin >> type[i]; } for(int i = 1; i <= n; i++){ cin >> source[i]; } for(int i = 1; i <= n; i++){ cin >> dest[i]; if(source[i] < dest[i]){ if(type[i] == 'E' || type[i] == 'C') con[0][dest[i]].push_back(source[i]); else con[1][dest[i]].push_back(source[i]); } } for(int i = 1; i <= m; i++){ for(int v : con[0][i]){ update(1, 1, v, 1); } for(int v : con[1][i]){ update(0, 1, v, 1); } dp[0][i] = get(1, 1, i - 1); dp[1][i] = get(0, 1, i - 1); dp2[0][i] = max(dp2[0][i - 1], dp[0][i]); dp2[1][i] = max(dp2[1][i - 1], dp[1][i]); dp3[i] = max(dp2[0][i], dp2[1][i]); update(0, i, i, dp2[0][i]); update(1, i, i, dp2[1][i]); } for(int x = 1; x <= n; x++){ int lo = 1, hi = m; if(dp3[hi] < x){ printf("-1 "); continue; } while(lo < hi){ int mid = (lo + hi) >> 1; if(dp3[mid] >= x) hi = mid; else lo = mid + 1; } printf("%d ", lo); } printf("\n"); } }