#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long

int t, n, m;

void sameDirRight(map<int,int> &mp, vector<int>& res) {
    auto it = mp.rbegin();
    //cout << "sameDirRight " << it->first << endl;
    while (it != mp.rend()) {
        int x1 = it->first;
        int i1 = it->second;
        //cout << "sameDirRight " << it->first << endl;
        auto pre_it = it;
        it++;
        if (it != mp.rend()) {
            int x2 = it->first;
            int i2 = it->second;
            int time = m - x1 + (x1 - x2) / 2;
            res[i1] = time;
            res[i2] = time;
            /*
            it++;

            bool flag = false;
            if (it == mp.rend())
                flag = true;
            mp.erase(x1);
            */
            //mp.erase(x1);
            it = map<int,int>::reverse_iterator(mp.erase( next(pre_it).base() ));
            it = map<int,int>::reverse_iterator(mp.erase( next(it).base() ));
            //mp.erase(x2);
            /*
            if (flag)
                break;
            */
        }
    }
}

void sameDirLeft(map<int,int> &mp, vector<int>& res) {
    auto it = mp.begin();
    while (it != mp.end()) {
        int x1 = it->first;
        int i1 = it->second;
        //cout << "sameDirLeft x1 " << x1 << endl;
        //cout << "sameDirLeft i1 " << i1 << endl;
        //cout << "sameDirLeft " << mp.size() << endl;
        it++;
        //cout << "sameDirLeft it++ " << it->first << endl;
        //cout << (it != mp.end()) << endl;

        if (it != mp.end()) {
            int x2 = it->first;
            int i2 = it->second;
            //cout << "sameDirLeft x2 " << x2 << endl;
            int time = x1 + (x2 - x1) / 2;
            res[i1] = time;
            res[i2] = time;
            it++;
            /*
            bool flag = false;
            if (it == mp.end())
                flag = true;
            */
            mp.erase(x1);
            mp.erase(x2);
            /*
            if (flag)
                break;
            */
        }

        //cout << "out if\n";
    }
    //cout << "out while\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    char c;

    cin >> t;
    while (t--) {
        cin >> n >> m;
        vector<int> a(n);
        for (int i = 0 ; i < n ; i++) {
            cin >> a[i];
        }
        map<int, int> oddLeft, evenLeft, oddRight, evenRight;
        //map<int, int> mpLeft;
        for (int i = 0 ; i < n ; i++) {
            cin >> c;
            if (c == 'R') {
                if (a[i] % 2 == 0) {
                    evenRight[a[i]] = i;
                    //cout << "A\n";
                } else {
                    oddRight[a[i]] = i;
                    //cout << "B\n";
                }
            } else {
                if (a[i] % 2 == 0) {
                    evenLeft[a[i]] = i;
                    //cout << "C\n";
                } else {
                    oddLeft[a[i]] = i;
                    //cout << "D\n";
                }
            }
        }
        vector<int> res(n, -1);
        auto it = oddRight.rbegin();
        while (it != oddRight.rend()) {
            //cout << it->first << endl;
            auto it2 = oddLeft.upper_bound(it->first);
            if (it2 != oddLeft.end()) {
                ll time = (it2->first - it->first) / 2;
                res[it->second] = time;
                res[it2->second] = time;
                int temp = it->first;
                /*
                it++;
                cout << "it++ " << it->first << endl;
                bool flag = false;
                if (it == oddRight.rend())
                    flag = true;
                oddRight.erase(temp);
                oddLeft.erase(it2->first);
                if (flag)
                    break;
                */
                it = map<int,int>::reverse_iterator(oddRight.erase( next(it).base() ));
                oddLeft.erase(it2->first);
            } else {
                it++;
            }
        }
        it = evenRight.rbegin();
        while (it != evenRight.rend()) {
            //cout << it->first << endl;
            auto it2 = evenLeft.upper_bound(it->first);
            if (it2 != evenLeft.end()) {
                ll time = (it2->first - it->first) / 2;
                res[it->second] = time;
                res[it2->second] = time;
                int temp = it->first;
                /*
                it++;
                bool flag = false;
                if (it == evenRight.rend())
                    flag = true;
                evenRight.erase(temp);
                evenLeft.erase(it2->first);
                if (flag)
                    break;
                */
                it = map<int,int>::reverse_iterator(evenRight.erase( next(it).base() ));
                evenLeft.erase(it2->first);
            } else {
                it++;
            }
        }

        sameDirLeft(oddLeft, res);
        //cout << "A\n";
        sameDirRight(oddRight, res);
        //cout << "B\n";
        sameDirLeft(evenLeft, res);
        //cout << "C\n";
        sameDirRight(evenRight, res);
        //cout << "D\n";


        auto it1 = oddLeft.begin();
        auto it2 = oddRight.rbegin();
        for (; it1 != oddLeft.end() && it2 != oddRight.rend() ; it1++, it2++) {
            int x1 = it1->first;
            int x2 = it2->first;
            int time = max(x1, m - x2) + (m - abs(m - x2 - x1)) / 2;
            res[it1->second] = time;
            res[it2->second] = time;
        }

        it1 = evenLeft.begin();
        it2 = evenRight.rbegin();
        for (; it1 != evenLeft.end() && it2 != evenRight.rend() ; it1++, it2++) {
            int x1 = it1->first;
            int x2 = it2->first;
            int time = max(x1, m - x2) + (m - abs(m - x2 - x1)) / 2;
            res[it1->second] = time;
            res[it2->second] = time;
        }

        for (int i = 0 ; i < n ; i++) {
            cout << res[i] << " ";
        }
        cout << "\n";
    }


    return 0;
}
/*
1
4 10
1 2 3 4
R R L L

1
2 8
7 5
R L
*/
