#include using namespace std; int N, M; vector> A[2]; vector S[2]; vector I[2]; vector dp; int size, offset; int parent(int x){ return (x-1)/2; } int left(int x){ return 2*x+1; } int right(int x){ return 2*x+2; } void perform_inc(int t, int cur){ S[t][cur] += I[t][cur]; if(cur < offset){ I[t][left(cur)] += I[t][cur]; I[t][right(cur)] += I[t][cur]; } I[t][cur] = 0; } void seginit(){ size = 1; while(size < M) size *= 2; offset = size-1; size = size*2-1; S[0].clear(); S[1].clear(); S[0].resize(size); S[1].resize(size); I[0].clear(); I[1].clear(); I[0].resize(size); I[1].resize(size); } void inc(int t, int cur, int l, int r, int cl=0, int cr=offset){ perform_inc(t, cur); if(l > cr || r < cl){ return; } if(l <= cl && r >= cr){ I[t][cur]++; perform_inc(t, cur); return; } int m = (cl+cr)/2; inc(t, left(cur), l, r, cl, m); inc(t, right(cur), l, r, m+1, cr); S[t][cur] = max(S[t][left(cur)], S[t][right(cur)]); } void set_val(int t, int cur, int val){ S[t][cur] = val; do{ cur = parent(cur); S[t][cur] = max(S[t][left(cur)], S[t][right(cur)]); }while(cur != 0); } int query(int t, int cur, int l, int r, int cl=0, int cr=offset){ perform_inc(t, cur); if(l > cr || r < cl){ return 0; } if(l <= cl && r >= cr){ return S[t][cur]; } int m = (cl+cr)/2; int x1 = query(t, left(cur), l, r, cl, m); int x2 = query(t, right(cur), l, r, m+1, cr); return max(x1, x2); } void printS(int t){ cout << "s" << t << ": "; for(int j=0; j<=offset; j++){ cout << query(t, 0, j, j) << " "; } cout << endl; } vector minimumZooNumbers(){ dp.clear(); dp.resize(M); seginit(); for(int i=0; i res(N); int ind = 0; for(int i=0; i ind){ res[ind++] = i+1; } } for( ; ind> cases; for(int a0 = 0; a0 < cases; a0++){ 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]--; } A[0].clear(); A[1].clear(); A[0].resize(M); A[1].resize(M); for(int i=0; i d[i]) continue; if(t[i] == 'E' || t[i] == 'C'){ A[0][d[i]].push_back(s[i]); } else{ A[1][d[i]].push_back(s[i]); } } vector result = minimumZooNumbers(); for (ssize_t i = 0; i < result.size(); i++) { cout << result[i] << (i != result.size() - 1 ? " " : ""); } cout << endl; } return 0; }