#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define pb push_back
#define st first
#define nd second
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
template <class T> T read(T &a) {
    a=0;char x=getchar();bool f=0;
    for(;x<'0'||x>'9';x=getchar())f|=x=='-';
	for(;x>='0'&&x<='9';x=getchar())a=(a<<3)+(a<<1)+x-'0';
    if(f)a=-a;
    return a;
}
using namespace std;

const int N = 3e5 + 5;

struct tp {
    int x, id;
    char p;
}d[N];

typedef pair<int, int> TP;

int n, m;

bool cmp(tp a, tp b) {
    return a.x < b.x;
}

bool vis[N];
int ans[N];

int main() {
    int T;
    read(T);
    while (T--) {
        memset(vis, 0, sizeof vis);
        memset(ans, 0, sizeof ans);
        read(n), read(m);
        for (int i = 1; i <= n; ++i) {
            read(d[i].x);
            d[i].id = i;
        }
        for (int i = 1; i <= n; ++i) {
            char s[3];
            scanf("%s", s);
            d[i].p = s[0];
        }
        sort(d + 1, d + n + 1, cmp);
        stack<TP> stk[2];
        for (int i = 1; i <= n; ++i) {
            if (d[i].p == 'R') {
                stk[d[i].x & 1].push(TP(i, d[i].x));
            } else {
                if (!stk[d[i].x & 1].empty()) {
                    int k = (d[i].x - stk[d[i].x & 1].top().nd) / 2;
                    ans[d[stk[d[i].x & 1].top().st].id] = ans[d[i].id] = k;
                    vis[stk[d[i].x & 1].top().st] = vis[i] = 1;
                    stk[d[i].x & 1].pop();
                }
            }
        }
        TP lst[2];
        lst[0] = lst[1] = TP(0, 0);
        for (int i = 1; i <= n; ++i) {
            if (d[i].p == 'L' && !vis[i]) {
                if (lst[d[i].x & 1].st) {
                    int k = (d[i].x + lst[d[i].x & 1].nd) / 2;
                    ans[d[i].id] = ans[d[lst[d[i].x & 1].st].id] = k;
                    vis[i] = vis[lst[d[i].x & 1].st] = 1;
                    lst[d[i].x & 1] = TP(0, 0);
                } else {
                    lst[d[i].x & 1] = TP(i, d[i].x);
                }
            }
        }
        lst[0] = lst[1] = TP(0, 0);
        for (int i = n; i >= 1; --i) {
            if (d[i].p == 'R' && !vis[i]) {
                if (lst[d[i].x & 1].st) {
                    int k = (2 * m - d[i].x - lst[d[i].x & 1].nd) / 2;
                    ans[d[i].id] = ans[d[lst[d[i].x & 1].st].id] = k;
                    vis[i] = vis[lst[d[i].x & 1].st] = 1;
                    lst[d[i].x & 1] = TP(0, 0);
                } else {
                    lst[d[i].x & 1] = TP(i, d[i].x);
                }
            }
        }
        queue<TP> q[2];
        for (int i = 1; i <= n; ++i) {
            if (d[i].p == 'L' && !vis[i]) {
                q[d[i].x & 1].push(TP(i, d[i].x));
            }
        }
        for (int i = n; i >= 1; --i) {
            if (d[i].p == 'R' && !vis[i]) {
                if (!q[d[i].x & 1].empty()) {
                    TP y = q[d[i].x & 1].front();
                    q[d[i].x & 1].pop();
                    int k = (m + (y.nd + m - d[i].x)) / 2;
                    ans[d[y.st].id] = ans[d[i].id] = k;
                }
            }
        }
        for (int i = 1; i <= n; ++i) {
            if (ans[i]) printf("%d ", ans[i]); else printf("-1 ");
        }
        puts("");
    }
	return 0;
}

