#include #include #include #include #include #define MAX 1010 using namespace std; pair > p[MAX]; int v[MAX], dp[MAX][MAX][4][2]; int rec(int index, int zoo, int lleva, int ok){ if(dp[index][zoo][lleva][ok] < 0){ if(index == 0 || zoo == 0){ return dp[index][zoo][lleva][ok] = 0; } int maxi = rec(index-1, zoo, lleva, ok), part = 0; int animal = p[index].second.second, start = p[index].second.first, end = p[index].first; if(end <= zoo){ part = rec(index-1, start, animal, 1)+1; } maxi = max(maxi, part); if(ok == 1 && start <= zoo && zoo < end && (lleva == animal || ((lleva+2) % 4) == animal)){ part = rec(index-1, min(start, zoo), lleva, 1)+1; } return dp[index][zoo][lleva][ok] = max(maxi, part); } return dp[index][zoo][lleva][ok]; } void solve(int n, int m){ sort(p+1, p+n+1); for(int i = 0; i <= n; i++){ for(int j = 0; j <= m; j++){ for(int k = 0; k < 4; k++){ dp[i][j][k][0] = dp[i][j][k][1] = -1; } } } /* for(int i = 1; i <= n; i++){ cout << p[i].second.first << " " << p[i].first << " " << p[i].second.second << endl; }//*/ for(int i = 0; i < 4; i++){ for(int j = 1; j <= m; j++){ rec(n, j, i, 0); } // cout << endl; }//*/ int index = 0; for(int j = 1; j <= m; j++){ int maxi = 0; for(int i = 0; i < 4; i++){ maxi = max(maxi, dp[n][j][i][0]); } while(index < maxi){ index++; v[index] = j; } } for(int i = 1; i <= index; i++){ printf("%d%c", v[i], i == n ? '\n' : ' '); } for(int i = index+1; i <= n; i++){ printf("-1%c", i == n ? '\n' : ' '); } return; } int main() { int n,m, cases; char s['Z'+1] = {0}; s['E'] = 0, s['D'] = 1, s['C'] = 2, s['M'] = 3; cin >> cases; while(cases--){ cin >> m >> n; string t; for(int i = 1; i <= n; i++){ cin >> t; p[i].second.second = s[t[0]]; } for(int i = 1; i <= n; i++){ cin >> p[i].second.first; } for(int i = 1; i <= n; i++){ cin >> p[i].first; } solve(n, m); } return 0; }