#include #include #include #include #include using namespace std; typedef vector::iterator viter; const int MAXN = 50010; int _w; int n, m, t[MAXN], s[MAXN], d[MAXN]; vector v[MAXN]; struct SGT { int addv[MAXN<<2], maxv[MAXN<<2]; int ql, qr, qv; void init() { memset(addv, 0, sizeof addv); memset(maxv, 0, sizeof maxv); } void _add( int o, int L, int R ) { if( L >= ql && R <= qr ) { addv[o] += qv; maxv[o] += qv; } else { int M = (L+R)/2, lc = o<<1, rc = lc|1; if( ql <= M ) _add(lc, L, M); if( qr > M ) _add(rc, M+1, R); maxv[o] = max( maxv[lc], maxv[rc] ) + addv[o]; } } void add( int l, int r, int v ) { ql = l, qr = r, qv = v; _add(1, 1, m); } int query() { return maxv[1]; } }; SGT sgt1, sgt2; int f[MAXN]; void solve() { sgt1.init(); sgt2.init(); for( int dest = 1; dest <= m; ++dest ) { for( viter it = v[dest].begin(); it != v[dest].end(); ++it ) { int i = *it; if( t[i] == 1 ) sgt1.add(1, s[i], 1); else sgt2.add(1, s[i], 1); } f[dest] = max( sgt1.query(), sgt2.query() ); assert( f[dest] <= n ); sgt1.add(dest, dest, f[dest]); sgt2.add(dest, dest, f[dest]); } } void print() { for( int i = 1; i <= m; ++i ) for( int j = f[i-1]; j < f[i]; ++j ) printf( "%d ", i ); for( int i = f[m]; i < n; ++i ) printf("-1 "); puts(""); } int main() { int T; _w = scanf( "%d", &T ); while( T-- ) { _w = scanf( "%d%d", &m, &n ); for( int i = 1; i <= n; ++i ) { char ch; _w = scanf( " %c", &ch ); if( ch == 'E' || ch == 'C' ) t[i] = 1; else t[i] = 2; } for( int i = 1; i <= n; ++i ) _w = scanf( "%d", s+i ); for( int i = 1; i <= n; ++i ) { _w = scanf( "%d", d+i ); if( s[i] < d[i] ) v[d[i]].push_back(i); } solve(), print(); for( int i = 1; i <= m; ++i ) v[i].clear(); } return 0; }