#include using namespace std; //defines #define openin freopen("input.txt","r",stdin) #define openout freopen("output.txt","w",stdout) #define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define ll long long #define int long long #define mod 1000000007 #define repr(i,x,y) for (__typeof(x) i=x;i>=y;i--) #define rep(i,x,y) for (__typeof(x) i=x;i<=y;i++) #define all(c) (c).begin(),(c).end() #define ff first #define ss second #define pb push_back #define mp make_pair /* Print pair */ template ostream & operator << (ostream &os , const pair &v) { os << "(" ; os << v.first << "," << v.second << ")" ; return os ; } /* Print vector */ template ostream & operator << (ostream &os , const vector &v) { os << "[" ; int sz = v.size() ; for(int i = 0 ; i < sz ; ++i) { os << v[i] ; if(i!=sz-1)os << "," ; } os << "]\n" ; return os ; } /* Print set */ template ostream & operator << (ostream &os , const set &v) { T last = *v.rbegin() ; os << "[" ; for(auto it : v) { os << it ; if(it != last) os << "," ; } os << "]\n" ; return os ; } /* Print Map */ template ostream & operator << (ostream &os , const map &v) { for(auto it : v) { os << it.first << " : " << it.second << "\n" ; } return os ; } int power(int a , int b) { int res = 1 ; while(b) { if(b%2) { res = (res * a) % mod ; } b/=2 ; a = (a*a) % mod ; } return res ; } //debug #define TRACE #ifdef TRACE #define trace(...) __f(#__VA_ARGS__, __VA_ARGS__) template void __f(const char* name, Arg1&& arg1){ cerr << name << " : " << arg1 << std::endl; } template void __f(const char* names, Arg1&& arg1, Args&&... args){ const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...); } #else #define trace(...) #endif const int N = 5e4 + 5 ; char type[N] ; vector > arr[N] ; int tree[2][N * 4] ; int lazy[2][N * 4] ; int st[N] , en[N] ; void build(int j,int i,int l,int r) { if(l == r) { tree[j][i] = 0 ; lazy[j][i] = 0 ; return ; } int m = l + r >> 1 ; build(j,i*2,l,m),build(j,i*2+1,m+1,r) ; } void push(int j,int i,int l,int r) { if(lazy[j][i]) { tree[j][i] += lazy[j][i] ; if(l != r) { lazy[j][i*2] += lazy[j][i] ; lazy[j][i*2+1] += lazy[j][i] ; } lazy[j][i] = 0 ; } } void update(int j,int i,int l,int r,int s,int e) { push(j,i,l,r) ; if(l > e || r < s) return ; if(l >= s && r <= e) { tree[j][i] += 1 ; if(l != r) { lazy[j][i*2] += 1 ; lazy[j][i*2+1] += 1 ; } return ; } int m = l + r >> 1 ; update(j,i*2,l,m,s,e) , update(j,i*2+1,m+1,r,s,e) ; tree[j][i] = max(tree[j][i*2],tree[j][i*2+1]) ; } void pointupdate(int j,int i,int l,int r,int idx,int val) { push(j,i,l,r) ; if(l == r) { tree[j][i] = val ; return ; } int m = l + r >> 1 ; if(idx <= m) pointupdate(j,i*2,l,m,idx,val) ; else pointupdate(j,i*2+1,m+1,r,idx,val) ; tree[j][i] = max(tree[j][i*2],tree[j][i*2+1]) ; } int query(int j,int i,int l,int r,int s,int e) { push(j,i,l,r) ; if(l > e || r < s) return 0; if(l >= s && r <= e) return tree[j][i] ; int m = l + r >> 1 ; return max(query(j,i*2,l,m,s,e),query(j,i*2+1,m+1,r,s,e)) ; } int ans[N] ; int32_t main() { fast; int t ; cin >> t ; while(t--) { int m , n ; cin >> m >> n ; rep(i,1,n) cin >> type[i] ; rep(i,1,n) cin >> st[i] ; rep(i,1,n) cin >> en[i] ; rep(i,1,n) { if(st[i] > en[i]) continue ; arr[en[i]].pb(mp(type[i],st[i])) ; } build(0,1,1,m) ; build(1,1,1,m) ; int cur = 0 ; rep(i,1,n) ans[i] = mod ; rep(i,1,m) { for(auto it : arr[i]) { if(it.first == 'D' || it.first == 'M') { update(0,1,1,m,1,it.second) ; } else { update(1,1,1,m,1,it.second) ; } } cur = max(query(0,1,1,m,1,i-1),query(1,1,1,m,1,i-1)) ; ans[cur] = min(ans[cur],i*1ll) ; pointupdate(0,1,1,m,i,cur) ; pointupdate(1,1,1,m,i,cur) ; } repr(i,n-1,1) ans[i] = min(ans[i],ans[i+1]); rep(i,1,n) if(ans[i] >= mod) ans[i] = -1 ; rep(i,1,n) cout << ans[i] << " " ; cout << endl ; rep(i,1,m) arr[i].clear() ; } return 0; }