#include #include #include #include #include #include #include #include #include #include #include using namespace std; static void solve(int m, const vector& aa, const vector& ss, const vector& ee, vector& result) { //ff: elephant, cat //gg: mouse, dog int n = (int)(aa.size()); vector< map > ff(m); vector< map > gg(m); for (int i = 0; i < n; ++i) { if (aa[i] == 'E' || aa[i] == 'C') { if (ff[ee[i]].find(ss[i]) == ff[ee[i]].end()) { ff[ee[i]].insert(::std::pair(ss[i], 1)); } else { ++ff[ee[i]][ss[i]]; } } else { if (gg[ee[i]].find(ss[i]) == gg[ee[i]].end()) { gg[ee[i]].insert(::std::pair(ss[i], 1)); } else { ++gg[ee[i]][ss[i]]; } } } //x: last leg is elephant, cat //y: last leg is mouse, dog vector x(m); vector y(m); x[0] = 0; y[0] = 0; //f: maximum number of elephant, cat from i to j inclusive //g: maximum number of mouse, dog from i to j inclusive vector f(m, 0); vector g(m, 0); //dp for (int i = 1; i < m; ++i) { { //update x x[i] = x[i - 1]; int cum = 0; for (map::const_reverse_iterator it = ff[i].rbegin(); it != ff[i].rend(); ++it) { int s = it->first; int c = it->second; f[s] += (c + cum); cum += c; x[i] = ::std::max(x[i], f[s] + y[s]); } } { //update y y[i] = y[i - 1]; int cum = 0; for (map::const_reverse_iterator it = gg[i].rbegin(); it != gg[i].rend(); ++it) { int s = it->first; int c = it->second; g[s] += (c + cum); cum += c; y[i] = ::std::max(y[i], g[s] + x[s]); } } } vector z(m); for (int i = 0; i < m; ++i) { z[i] = ::std::max(x[i], y[i]); } int j = 0; result.resize(n); for (int i = 0; i < n; ++i) { int c = i + 1; while (j < m && z[j] < c) { ++j; } if (j < m) { result[i] = j; } else { result[i] = -1; } } } int main() { int cases; cin >> cases; for(int a0 = 0; a0 < cases; a0++){ int m; int n; cin >> m >> n; vector t(n); for(int t_i = 0; t_i < n; t_i++){ cin >> t[t_i]; } vector s(n); for(int s_i = 0; s_i < n; s_i++){ cin >> s[s_i]; --s[s_i]; } vector d(n); for(int d_i = 0; d_i < n; d_i++){ cin >> d[d_i]; --d[d_i]; } vector result; solve(m, t, s, d, result); for (ssize_t i = 0; i < result.size(); i++) { cout << (result[i] == -1 ? result[i] : (result[i] + 1)) << (i != result.size() - 1 ? " " : ""); } cout << endl; } return 0; }