#include using namespace std; typedef pair ii; #define pb push_back #define sqr(x) ((x)*(x)) #define DEBUG(x) std::cerr << x #define DEBUG2(x) std::cerr << x << '\n' const char *fin = ""; const char *fon = ""; const int OO = (int)(1e9 + 7); const int MAXN = (int)(5e4+5); class dat { public: int l, r, typ; bool operator < (const dat &lhs) { if (r == lhs.r) return l < lhs.l; else return r < lhs.r; } }; dat a[MAXN], a_tmp[MAXN]; int n, m, backup_n; int lz[5 * MAXN][3]; int IT[5 * MAXN][3]; int f[MAXN]; void Lazy(int k, int l, int r, int id) { IT[k][id] += lz[k][id]; if (l < r) { lz[k << 1][id] += lz[k][id]; lz[k << 1 | 1][id] += lz[k][id]; } lz[k][id] = 0; } void UpdatePos(int k, int l, int r, int pos, int id) { Lazy(k ,l, r, id); if (l > pos || r < pos) return; if (l == r) { IT[k][id] = f[pos]; return; } int mid = (l + r) >> 1; UpdatePos(k << 1, l, mid, pos, id); UpdatePos(k << 1 | 1, mid + 1, r, pos, id); IT[k][id] = max(IT[k << 1][id], IT[k << 1 | 1][id]); } void Update(int k, int l, int r, int i, int j, int id) { Lazy(k, l, r, id); if (l > j || r < i) return; if (i <= l && r <= j) { lz[k][id] += 1; Lazy(k, l, r, id); return; } int mid = (l + r) >> 1; Update(k << 1, l, mid, i, j, id); Update(k << 1 | 1, mid + 1, r, i, j, id); IT[k][id] = max(IT[k << 1][id], IT[k << 1 | 1][id]); } int Get(int k, int l, int r, int i, int j, int id) { Lazy(k, l, r, id); if (l > j || r < i) return 0; if (i <= l && r <= j) return IT[k][id]; int tmp = 0; int mid = (l + r) >> 1; tmp = max(Get(k << 1, l, mid, i, j, id), Get(k << 1 | 1, mid + 1, r, i, j, id)); IT[k][id] = max(IT[k << 1][id], IT[k << 1 | 1][id]); return tmp; } void UpdateF(int i, int id) { int f_max = Get(1, 1, m, 1, i - 1, id); if (f[i] < f_max) { f[i] = f_max; UpdatePos(1, 1, m, i ,1); UpdatePos(1, 1, m, i ,2); } } void BSearch(int x) { int lo = 1, hi = m, mid = (lo + hi) >> 1, res = -1; while (lo != mid && hi != mid) { if (f[mid] >= x) hi = mid; else lo = mid; mid = (lo + hi) >> 1; } for(int i = lo; i <= hi; ++i) if (f[i] >= x) { res = i; break; } cout << res << ' '; } void Sol() { sort(a + 1, a + n + 1); memset(f, 0, sizeof(f)); memset(lz, 0, sizeof(lz)); memset(IT, 0, sizeof(IT)); int i_n = 0; for(int i = 1; i <= m; ++i) { while (i_n <= n && a[i_n].r < i) ++i_n; //if (i_n <= n && a[i_n].r <= i) if (i_n > n && a[i_n].r > i); else while (i_n <= n && a[i_n].r == i) { Update(1, 1, m, 1, a[i_n].l, a[i_n].typ); ++i_n; } UpdateF(i, 1); UpdateF(i, 2); } /*for(int i = 1; i <= m; ++i) cout << f[i] << ' '; cout << '\n';*/ for(int i = 1; i <= backup_n; ++i) { BSearch(i); } cout << '\n'; } void Inp() { int t; cin >> t; map mp; mp['D'] = 1; mp['M'] = 1; mp['E'] = 2; mp['C'] = 2; while (t--) { cin >> m >> n; backup_n = n; int cnt = 0; for(int i = 1; i <= n; ++i) { char c; cin >> c; a_tmp[i].typ = mp[c]; } for(int i = 1; i <= n; ++i) cin >> a_tmp[i].l; for(int i = 1; i <= n; ++i) cin >> a_tmp[i].r; for(int i = 1; i <= n; ++i) if (a_tmp[i].l <= a_tmp[i].r) a[++cnt] = a_tmp[i]; n = cnt; Sol(); } } int main(int argc, char *argv[]) { //freopen(fin, "r", stdin);freopen(fon, "w", stdout); ios_base::sync_with_stdio(false);cin.tie(NULL); Inp(); return 0; }