#include <bits/stdc++.h>
#define mp make_pair
#define pii pair<int, int>
using namespace std;
struct compare{
bool operator()(pii& p1, pii& p2){
if(p1.second == p2.second) return p1.first < p2.first;
return p1.second > p2.second;
}
};
vector<pii> pairs[3];
priority_queue<pii, vector<pii>, compare> q1, q2;
int m, dp[100001], n, seg[200001], lazy[200001] = {0};
class seg_tree{
int seg[200001], lazy[200001];
public :
seg_tree(){
for(int j = 0; j < 200001; j++)
seg[j] = lazy[j] = 0;
}
void update_lazy(int, int, int);
void update(int, int, int, int, int, int);
int query(int, int, int, int, int);
};
void seg_tree :: update_lazy(int l, int r, int i){
if(l != r) lazy[i*2+1] += lazy[i], lazy[i*2+2] += lazy[i];
seg[i] += lazy[i];
lazy[i] = 0;
}
void seg_tree :: update(int l, int r, int i, int x, int y, int val){
if(lazy[i]) update_lazy(l, r, i);
if(r < x || l > y) return;
if(l >= x && r <= y){
seg[i] += val;
if(l != r) lazy[i*2+1] += val, lazy[i*2+2] += val;
return;
}
int mid = (l+r)/2;
update(l, mid, i*2+1, x, y, val);
update(mid+1, r, i*2+2, x, y, val);
if(l != r) seg[i] = max(seg[i*2+1], seg[i*2+2]);
}
int seg_tree :: query(int l, int r, int i, int x, int y){
if(lazy[i]) update_lazy(l, r, i);
if(r < x || l > y) return 0;
if(l >= x && r <= y) return seg[i];
int mid = (l+r)/2;
int left = query(l, mid, i*2+1, x, y);
int right = query(mid+1, r, i*2+2, x, y);
if(l != r) seg[i] = max(seg[i*2+1], seg[i*2+2]);
return max(left, right);
}
seg_tree *s1, *s2;
void build(){
cin >> m >> n;
string which[n + 1];
int starting[n + 1], ending[n + 1];
for(int j = 0; j < n; j++)
cin >> which[j];
for(int j = 0; j < n; j++)
cin >> starting[j];
for(int j = 0; j < n; j++)
cin >> ending[j];
for(int j = 0; j < n; j++){
if(starting[j] > ending[j]) continue;
if(which[j][0] == 'E') q1.push(mp(starting[j], ending[j]));
else if(which[j][0] == 'D') q2.push(mp(starting[j], ending[j]));
else if(which[j][0] == 'C') q1.push(mp(starting[j], ending[j]));
else q2.push(mp(starting[j], ending[j]));
}
s1 = new seg_tree;
s2 = new seg_tree;
}
void build_dp(){
dp[0] = 0;
for(int j = 1; j <= m; j++){
int ans = 0;
while(!q1.empty() && q1.top().second == j){
pii p = q1.top();
q1.pop();
s1->update(0, m, 0, 1, p.first, 1);
int curr = s1->query(0, m, 0, 1, p.first);
if(ans < curr) ans = curr;
}
while(!q2.empty() && q2.top().second == j){
pii p = q2.top();
q2.pop();
s2->update(0, m, 0, 1, p.first, 1);
int curr = s2->query(0, m, 0, 1, p.first);
if(ans < curr) ans = curr;
}
dp[j] = ans;
s1->update(0, m, 0, j, j, dp[j]);
s2->update(0, m, 0, j, j, dp[j]);
}
}
int main(){
int t;
cin >> t;
while(t--){
build();
build_dp();
int ans[n + 1], k = 1;
for(int j = 1; j <= m; j++){
while(k <= n && k <= dp[j])
ans[k++] = j;
}
for(int j = k; j <= n; j++)
ans[j] = -1;
for(int j = 1; j <= n; j++)
cout << ans[j] << " ";
cout << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGlpIHBhaXI8aW50LCBpbnQ+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGNvbXBhcmV7CiAgICBib29sIG9wZXJhdG9yKCkocGlpJiBwMSwgcGlpJiBwMil7CiAgICAgICAgaWYocDEuc2Vjb25kID09IHAyLnNlY29uZCkgcmV0dXJuIHAxLmZpcnN0IDwgcDIuZmlyc3Q7CiAgICAgICAgcmV0dXJuIHAxLnNlY29uZCA+IHAyLnNlY29uZDsKICAgIH0gIAp9OwoKdmVjdG9yPHBpaT4gcGFpcnNbM107Cgpwcmlvcml0eV9xdWV1ZTxwaWksIHZlY3RvcjxwaWk+LCBjb21wYXJlPiBxMSwgcTI7CgppbnQgbSwgZHBbMTAwMDAxXSwgbiwgc2VnWzIwMDAwMV0sIGxhenlbMjAwMDAxXSA9IHswfTsKCmNsYXNzIHNlZ190cmVlewoJaW50IHNlZ1syMDAwMDFdLCBsYXp5WzIwMDAwMV07CglwdWJsaWMgOgoJCXNlZ190cmVlKCl7CgkJCWZvcihpbnQgaiA9IDA7IGogPCAyMDAwMDE7IGorKykKCQkJCXNlZ1tqXSA9IGxhenlbal0gPSAwOwoJCX0KCgl2b2lkIHVwZGF0ZV9sYXp5KGludCwgaW50LCBpbnQpOwoJdm9pZCB1cGRhdGUoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7CglpbnQgcXVlcnkoaW50LCBpbnQsIGludCwgaW50LCBpbnQpOwp9OwoKdm9pZCBzZWdfdHJlZSA6OiB1cGRhdGVfbGF6eShpbnQgbCwgaW50IHIsIGludCBpKXsKCWlmKGwgIT0gcikgbGF6eVtpKjIrMV0gKz0gbGF6eVtpXSwgbGF6eVtpKjIrMl0gKz0gbGF6eVtpXTsKCXNlZ1tpXSArPSBsYXp5W2ldOwoJbGF6eVtpXSA9IDA7Cn0KCnZvaWQgc2VnX3RyZWUgOjogdXBkYXRlKGludCBsLCBpbnQgciwgaW50IGksIGludCB4LCBpbnQgeSwgaW50IHZhbCl7CglpZihsYXp5W2ldKSB1cGRhdGVfbGF6eShsLCByLCBpKTsKCWlmKHIgPCB4IHx8IGwgPiB5KSByZXR1cm47CglpZihsID49IHggJiYgciA8PSB5KXsKCQlzZWdbaV0gKz0gdmFsOwoJCWlmKGwgIT0gcikgbGF6eVtpKjIrMV0gKz0gdmFsLCBsYXp5W2kqMisyXSArPSB2YWw7CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IChsK3IpLzI7Cgl1cGRhdGUobCwgbWlkLCBpKjIrMSwgeCwgeSwgdmFsKTsKCXVwZGF0ZShtaWQrMSwgciwgaSoyKzIsIHgsIHksIHZhbCk7CglpZihsICE9IHIpIHNlZ1tpXSA9IG1heChzZWdbaSoyKzFdLCBzZWdbaSoyKzJdKTsKfQoKaW50IHNlZ190cmVlIDo6IHF1ZXJ5KGludCBsLCBpbnQgciwgaW50IGksIGludCB4LCBpbnQgeSl7CglpZihsYXp5W2ldKSB1cGRhdGVfbGF6eShsLCByLCBpKTsKCWlmKHIgPCB4IHx8IGwgPiB5KSByZXR1cm4gMDsKCWlmKGwgPj0geCAmJiByIDw9IHkpIHJldHVybiBzZWdbaV07CglpbnQgbWlkID0gKGwrcikvMjsKCWludCBsZWZ0ID0gcXVlcnkobCwgbWlkLCBpKjIrMSwgeCwgeSk7CglpbnQgcmlnaHQgPSBxdWVyeShtaWQrMSwgciwgaSoyKzIsIHgsIHkpOwoJaWYobCAhPSByKSBzZWdbaV0gPSBtYXgoc2VnW2kqMisxXSwgc2VnW2kqMisyXSk7CglyZXR1cm4gbWF4KGxlZnQsIHJpZ2h0KTsKfQoKc2VnX3RyZWUgKnMxLCAqczI7Cgp2b2lkIGJ1aWxkKCl7CgljaW4gPj4gbSA+PiBuOwoJc3RyaW5nIHdoaWNoW24gKyAxXTsKCWludCBzdGFydGluZ1tuICsgMV0sIGVuZGluZ1tuICsgMV07CgoJZm9yKGludCBqID0gMDsgaiA8IG47IGorKykKCQljaW4gPj4gd2hpY2hbal07Cglmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKQoJCWNpbiA+PiBzdGFydGluZ1tqXTsKCWZvcihpbnQgaiA9IDA7IGogPCBuOyBqKyspCgkJY2luID4+IGVuZGluZ1tqXTsKCglmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKXsKICAgICAgICBpZihzdGFydGluZ1tqXSA+IGVuZGluZ1tqXSkgY29udGludWU7CgkJaWYod2hpY2hbal1bMF0gPT0gJ0UnKSBxMS5wdXNoKG1wKHN0YXJ0aW5nW2pdLCBlbmRpbmdbal0pKTsKCQllbHNlIGlmKHdoaWNoW2pdWzBdID09ICdEJykgcTIucHVzaChtcChzdGFydGluZ1tqXSwgZW5kaW5nW2pdKSk7CgkJZWxzZSBpZih3aGljaFtqXVswXSA9PSAnQycpIHExLnB1c2gobXAoc3RhcnRpbmdbal0sIGVuZGluZ1tqXSkpOwoJCWVsc2UgcTIucHVzaChtcChzdGFydGluZ1tqXSwgZW5kaW5nW2pdKSk7Cgl9CgoJczEgPSBuZXcgc2VnX3RyZWU7CglzMiA9IG5ldyBzZWdfdHJlZTsKfQoKCnZvaWQgYnVpbGRfZHAoKXsKCWRwWzBdID0gMDsKCWZvcihpbnQgaiA9IDE7IGogPD0gbTsgaisrKXsKCQlpbnQgYW5zID0gMDsKCgkJd2hpbGUoIXExLmVtcHR5KCkgJiYgcTEudG9wKCkuc2Vjb25kID09IGopewoJCQlwaWkgcCA9IHExLnRvcCgpOwoJCQlxMS5wb3AoKTsKCQkJczEtPnVwZGF0ZSgwLCBtLCAwLCAxLCBwLmZpcnN0LCAxKTsKCQkJaW50IGN1cnIgPSBzMS0+cXVlcnkoMCwgbSwgMCwgMSwgcC5maXJzdCk7CgkJCWlmKGFucyA8IGN1cnIpIGFucyA9IGN1cnI7CgkJfQoKCQl3aGlsZSghcTIuZW1wdHkoKSAmJiBxMi50b3AoKS5zZWNvbmQgPT0gail7CgkJCXBpaSBwID0gcTIudG9wKCk7CgkJCXEyLnBvcCgpOwoJCQlzMi0+dXBkYXRlKDAsIG0sIDAsIDEsIHAuZmlyc3QsIDEpOwoJCQlpbnQgY3VyciA9IHMyLT5xdWVyeSgwLCBtLCAwLCAxLCBwLmZpcnN0KTsKCQkJaWYoYW5zIDwgY3VycikgYW5zID0gY3VycjsKCQl9CgoJCWRwW2pdID0gYW5zOwoJCXMxLT51cGRhdGUoMCwgbSwgMCwgaiwgaiwgZHBbal0pOwoJCXMyLT51cGRhdGUoMCwgbSwgMCwgaiwgaiwgZHBbal0pOwoJfQp9CgppbnQgbWFpbigpewoJaW50IHQ7CiAgICBjaW4gPj4gdDsKCXdoaWxlKHQtLSl7CgkJYnVpbGQoKTsKCQlidWlsZF9kcCgpOwoJCWludCBhbnNbbiArIDFdLCBrID0gMTsKCQlmb3IoaW50IGogPSAxOyBqIDw9IG07IGorKyl7CgkJCXdoaWxlKGsgPD0gbiAmJiBrIDw9IGRwW2pdKQoJCQkJYW5zW2srK10gPSBqOwoJCX0KCQlmb3IoaW50IGogPSBrOyBqIDw9IG47IGorKykKCQkJYW5zW2pdID0gLTE7CgkJZm9yKGludCBqID0gMTsgaiA8PSBuOyBqKyspCgkJCWNvdXQgPDwgYW5zW2pdIDw8ICIgIjsKCQljb3V0IDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQo=