/*
    
    Note        :           helluva implementation.
 
    Link        :       
 
    Boka hoye gelum...
*/



#include "bits/stdc++.h"
 
#define sp <<" "
#define el <<"\n"
#define S second
#define F first
#define pb push_back
#define all(ar) ar.begin(),ar.end() 
#define pii pair<ll,ll> 
 

using namespace std;
using ll = long long;
using ld = long double;
 
const ll mod = 1000000007;
const ll oo = 3372036000000000;
const ll si = 300005;

vector<pair<pii,char>> vec; 
ll ans[si],in[si],n,m;
char dir[si];  
bool don[si]; 

void sm_dir(char q){
	stack<pii> od,ev; 
	for(ll i = q == 'L' ? 0 : n - 1; i < n && i >=  0; q == 'L'? i++ : i--){
		if(don[vec[i].F.S] || vec[i].S != q) continue; 
		pii da,cur = vec[i].F; 
		if(cur.F & 1){
			if(od.empty()){
				od.push(cur); 
				continue; 
			}
			da = od.top(); od.pop(); 
		}else{
			if(ev.empty()){
				ev.push(cur); continue; 
			}
			da = ev.top(); ev.pop(); 
		}
		ll tim = abs(da.F - cur.F)/2; 
		if(q == 'R') tim += m - da.F; 
		else tim += da.F; 
		don[da.S] = don[cur.S] = 1; 
		ans[da.S] = ans[cur.S] = tim; 
	}
}


void baki(){
	stack<pii> od,ev; 
	for(ll i = 0; i < n; i++){
		if(don[vec[i].F.S]) continue; 
		if(vec[i].S == 'L'){
			if(vec[i].F.F&1) od.push(vec[i].F); 
			else ev.push(vec[i].F); 
		}
	}
	for(ll i = n-1; i >= 0; i--){
		if(don[vec[i].F.S]) continue; 
		if(vec[i].S == 'R'){
			pii cur = vec[i].F,da; 
			if(cur.F & 1){
				if(od.empty()) continue; 
				da = od.top(); od.pop(); 
			}else{
				if(ev.empty()) continue; 
				da = ev.top(); ev.pop(); 
			}
			ll tim = 0;  
			if(m - cur.F > da.F){
				ll wae = m - cur.F,nda = (wae - da.F); // sure?  
				ll dis = (m - nda)/2; 
				tim += wae; 
				tim += dis; 
			}else{
				ll wae = da.F, nda = ((2 * m) - (cur.F + wae))/2; 
				tim += (wae + nda); 
			}
			ans[cur.S] = ans[da.S] = tim;
		}
	}
}


signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
//*
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif
//*/
    ll t; cin>>t; 
    while(t--){
    	vec.clear();
    	memset(ans,-1,sizeof(ans));
    	memset(don,0,sizeof(don));   
    	cin>>n>>m;
    	for(ll i = 0; i < n; i++) cin>>in[i]; 
    	for(ll i = 0; i < n; i++) cin>>dir[i]; 
    	for(ll i = 0; i < n; i++){
    		ll x = in[i]; char d = dir[i]; 
    		vec.pb({{x,i},d}); 
    	} 
    	sort(all(vec)); 
    	stack<pii> ev,od;  
    	for(ll i = 0; i < n; i++){
    		if(vec[i].S == 'R'){
    			if(vec[i].F.F & 1) od.push(vec[i].F); 
    			else ev.push(vec[i].F); 
    		}else{
    			pii da,cur = vec[i].F; 
    			if(vec[i].F.F & 1){
    				if(od.empty()) continue; 
    				da = od.top(); od.pop(); 
    			}else{
    				if(ev.empty()) continue; 
    				da = ev.top(); ev.pop(); 
    			}
    			ll tim = (cur.F - da.F)/2; 
    			don[cur.S] = don[da.S] = 1; 
    			ans[cur.S] = ans[da.S] = tim; 
    		}
    	}
    	sm_dir('L'); 
    	sm_dir('R');
    	baki(); 
    	for(ll i = 0; i < n; i++) cout<<ans[i] sp; cout el; 
    }
    return 0;
}