
#include <bits/stdc++.h>
using namespace std;
#define int int
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
const double PI = 4*atan(1);

#define loop(i,n) for(int i=0;i<n;i++)
#define itr(it,v)  for(auto it=v.begin();it!=v.end();++it)  
#define IOS ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define debug(x) cout << "[ " << #x  << " : " << x << " ]" << endl ;
#define mod (int)(1e9+9)
using namespace std; 


int x[300005],ans[300005];
vector<int> odd,even;
 stack<int> st,st2,st1;

void solve()
{
  int n,m;
  cin>>n>>m;

  odd.clear();
  even.clear();

  map<int,int> mp;
  for(int i=0;i<n;i++)
   { cin>>x[i],ans[i]=-1;
     mp[x[i]]=i;
   }

  int dir[n];

  

  for (int i = 0; i < n; ++i)
  {

    char ch;
    cin>>ch;

    
      if(x[i]%2)
        odd.push_back(x[i]);
      else
        even.push_back(x[i]);
        
      if(ch=='L')
       dir[i]=-1;
     else
       dir[i]=1;

  }

  sort(all(odd));
  sort(all(even));

 
  for (int i = odd.size()-1; i >=0; --i)
  {
    int node=mp[odd[i]];
    //cout<<node<<" ";
    if(dir[node]==-1)
      st.push(node);
      
    else if(!st.empty())
    {
      int vv= st.top();
      st.pop();

      ans[node] = abs(x[node] -x[vv])/2;
      ans[vv] = abs(x[node] -x[vv])/2;
    }
    else
      st2.push(node);
  }

  //vector<int> v1;
  while(!st2.empty())
  {
    st1.push(st2.top());
    st2.pop();
  }

  while(st1.size()>=2)            //--> -->
  {
    int x1=st1.top();
    st1.pop();
    int x2=st1.top();
    st1.pop();

    ans[x1] = (2*m-x[x1]-x[x2])/2;
    ans[x2] = (2*m-x[x1]-x[x2])/2;
  }

  while(st.size()>=2)
  {
    int x1=st.top();
    st.pop();
    int x2=st.top();
    st.pop();

    ans[x1] = (x[x1]+x[x2])/2;
    ans[x2] = (x[x1]+x[x2])/2;
  }

  if(st1.size()==1 and st.size()==1)
  {
    int x1=st1.top();
    st1.pop();
    int x2=st.top();
    st.pop();

    ans[x1] = ((m-x[x1])+m+x[x2])/2;
    ans[x2] = ((m-x[x1])+m+x[x2])/2;
  }
  while(!st1.empty())
    st1.pop();
  while(!st.empty())
    st.pop();

  for (int i = even.size()-1; i >=0; --i)
  {
    int node=mp[even[i]];
    //cout<<node<<" ";
    if(dir[node]==-1)
      st.push(node);
      
    else if(!st.empty())
    {
      int vv= st.top();
      st.pop();

      ans[node] = abs(x[node] -x[vv])/2;
      ans[vv] = abs(x[node] -x[vv])/2;
    }
    else
      st2.push(node);
  }

  //vector<int> v1;
  while(!st2.empty())
  {
    st1.push(st2.top());
    st2.pop();
  }

  while(st1.size()>=2)            //--> -->
  {
    int x1=st1.top();
    st1.pop();
    int x2=st1.top();
    st1.pop();

    ans[x1] = (2*m-x[x1]-x[x2])/2;
    ans[x2] = (2*m-x[x1]-x[x2])/2;
  }

  while(st.size()>=2)
  {
    int x1=st.top();
    st.pop();
    int x2=st.top();
    st.pop();

    ans[x1] = (x[x1]+x[x2])/2;
    ans[x2] = (x[x1]+x[x2])/2;
  }

  if(st1.size()==1 and st.size()==1)
  {
    int x1=st1.top();
    st1.pop();
    int x2=st.top();
    st.pop();

    ans[x1] = ((m-x[x1])+m+x[x2])/2;
    ans[x2] = ((m-x[x1])+m+x[x2])/2;
  }


  for (int i = 0; i < n; ++i)
  {
    cout<<ans[i]<<" ";
    /* code */
  }
  
  while(!st1.empty())
    st1.pop();
  while(!st.empty())
    st.pop();


  cout<<endl;

}

int main()
{
    int t;
    cin>>t;
    
    while(t--)
    {
      solve();
    }
    return 0; 
}