#include #include #include #include #include using namespace std; const int N = 1e5 + 10; class data { public: string t; int u, v; } animals[N]; vector adj1[N], adj2[N]; int ans[N]; int m, n; class node { public: node *left, *right; int max, offset, l, r; void update(int a, int b, int val) { if (a <= l and r <= b) { offset += val; max += val; return; } if (b < l || r < a) { return; } left->update(a, b, val); right->update(a, b, val); this->max = std::max(left->max, right->max) + offset; } node(int a, int b) : left(a < b ? new node(a, (a+b)/2) : nullptr), right(a < b ? new node((a+b)/2 + 1, b) : nullptr), max(0), offset(0), l(a), r(b) {} ~node() { if (left) delete left; if (right) delete right; } }; void solve() { cin >> m >> n; for (int i = 0; i < n; ++i) cin >> animals[i].t; for (int i = 0; i < n; ++i) cin >> animals[i].u; for (int i = 0; i < n; ++i) cin >> animals[i].v; for (int i = 1; i <= m; ++i) { adj1[i].clear(); adj2[i].clear(); } for (int i = 0; i < n; ++i) { if (animals[i].t == "D" or animals[i].t == "M") { adj1[animals[i].v].push_back(animals[i].u); } else { adj2[animals[i].v].push_back(animals[i].u); } } node* head1 = new node(0, m); node* head2 = new node(0, m); for (int i = 1; i <= n; ++i) { ans[i] = -1; } for (int i = 1; i <= m; ++i) { for (int u : adj1[i]) { if (u < i) head1->update(0, u, 1); } for (int u : adj2[i]) { if (u < i) head2->update(0, u, 1); } int val = max(head1->max, head2->max); head1->update(i, i, val); head2->update(i, i, val); if (ans[val] == -1) { ans[val] = i; } } for (int i = n-1; i >= 1; --i) { if (ans[i] == -1) { ans[i] = ans[i+1]; } } for (int i = 1; i <= n; ++i) { cout << ans[i] << " "; } cout << endl; delete head1; delete head2; } int main() { cin.sync_with_stdio(false); cin.tie(0); int t; cin >> t; for (int i = 0; i < t; ++i) { solve(); } return 0; }