#include #include #include #include #include #include using namespace std; const int N = 50002; int dp[N][2]; int comm_t[N],str[N],dd[N]; vector> graph(N); int deepH[4*N][2],cache[4*N][2]; void prop(int i, int j, bool leaf){ deepH[i][j] += cache[i][j]; if(!leaf){ cache[2*i][j] += cache[i][j]; cache[2*i+1][j] += cache[i][j]; } cache[i][j] = 0; } int get_answer(int i, int first, int last, int l, int r, int j){ prop(i, j, first == last); if(l <= first && r >= last) return deepH[i][j]; if(r < first || l > last) return 0; int mid = (first+last)/2; return max(get_answer(2*i,first,mid,l,r,j), get_answer(2*i+1,mid+1,last,l,r,j)); } void change(int i, int first, int last, int l, int r, int j, int v){ prop(i, j, first == last); if(l <= first && r >= last){ cache[i][j] += v; prop(i, j, first == last); return; } if(r < first || l > last) return; int mid = (first+last)/2; change(2*i, first, mid, l, r, j, v); change(2*i+1, mid+1, last, l, r, j, v); deepH[i][j] = max(deepH[2*i][j], deepH[2*i+1][j]); } int main() { int T; cin >> T; while(T--){ int n , m; cin >> m >> n; for(int i = 1; i <= n; i++){ char comm; cin >> comm; comm_t[i] = comm == 'D' or comm == 'M' ? 0 : 1; } for(int i = 1; i <= n; i++){ cin >> str[i]; } for(int i = 1; i <= n; i++){ cin >> dd[i]; graph[dd[i]].push_back(i); } for(int i = 1; i <= m; i++){ for(auto index : graph[i]){ if(str[index] < i) change(1,1,m, 1, str[index], !comm_t[index], 1); } dp[i][0] = get_answer(1,1,m, 1, i, 1); dp[i][1] = get_answer(1,1,m, 1, i, 0); change(1,1,m, i, i, 0, dp[i][0]); change(1,1,m, i, i, 1, dp[i][1]); } vector res; for(int i = 1; i <= m; i++) res.push_back(max(dp[i][0], dp[i][1])); for(int i = 1; i <= n; i++){ int r = lower_bound(res.begin(), res.end() , i) - res.begin() + 1; if(r == m + 1){ r = -1; } cout << r << " "; } cout << "\n"; graph.clear(); graph.resize(N); memset(deepH,0,sizeof(deepH)); memset(cache, 0 , sizeof(cache)); } return 0; }