#include using namespace std; #define ll long long #define mod 1000000007LL #define eps 1e-13 #define PI 3.141592653589793238L #define INF 1000000011 #define INFLL 1000000000000000011LL // #define space printf(" ") #define endl '\n' #define vi vector #define vll vector #define vc vector #define vs vector #define pii pair #define pll pair #define pil pair #define pli pair #define pcc pair #define pdd pair #define mp make_pair #define F first #define S second #define pb(x) push_back(x) #define fo(i,a,n) for(i = (a); i < (n); i++) #define sd(x) scanf("%d", &(x)) #define pd(x) printf("%d", (x)) #define pdn(x) printf("%d\n", (x)) #define slld(x) scanf("%lld", &(x)) #define plld(x) printf("%lld", (x)) #define plldn(x) printf("%lld\n", (x)) #define sllf(x) scanf("%llf", &(x)) #define pllf(x) printf("%.9llf", (x)) #define pllfn(x) printf("%.9llf\n", (x)) #define sch(x) scanf("%c", &(x)) #define pch(x) printf("%c", (x)) #define pchn(x) printf("%c\n", (x)) #define gtl(x) getline(cin, (x)) #define flsh fflush(stdout) #define sws ios_base::sync_with_stdio(false); cin.tie(0) #define gcd __gcd #define clr(x) memset(x,0,sizeof(x)) #define all(a) (a).begin(), (a).end() #define foreach(i,a) for(__typeof((a).begin()) i = (a).begin(); i != (a).end(); ++i) #define sz(a) (int)((a).size()) #define io_file freopen("D:/Coding Problems/Contest/input_file.in", "r", stdin);freopen("D:/Coding Problems/Contest/output_file.out", "w", stdout) ll modx(ll Base, ll exponent) { ll ans = 1; if(Base == 1) return Base; while(exponent) { if(exponent & 1) ans = (ans * Base)%mod; Base = (Base * Base)%mod; exponent = exponent >> 1; } return ans; } ll inmodx(ll num) { return (modx(num, mod-2LL)); } bool cmp()//true for a before b { bool ans = 0; return ans; } struct ST_Node { ST_Node() { return; } void assign_value_(int val) { return; } void merge_nodes_(ST_Node& left, ST_Node& right) { return; } }; const int N = (1e5) + 9; const int M = (N<<2) + 9; const int LOGN = ((int)log2(N)) + 3; const int LOGM = ((int)log2(M)) + 3; const int BUCK = 50; map < char , int > mapp; int dp[N], type[N], st[M][2], ln[M][2], ans[N]; pii p[N]; vi v[N][2]; void build(int node, int l, int r) { if(l > r) return; ln[node][0] = ln[node][1] = 0; if(l == r) { st[node][0] = st[node][1] = 0; return; } int mid = (l+r)>>1; int left = node<<1; int right = left|1; build(left,l,mid); build(right,mid+1,r); st[node][0] = max(st[left][0], st[right][0]); st[node][1] = max(st[left][1], st[right][1]); return; } void update(int node, int l, int r, int ind, int val, int type) { if(l > r) return; int mid = (l+r)>>1; int left = node<<1; int right = left|1; if(r > l) { ln[left][type] += ln[node][type]; ln[right][type] += ln[node][type]; } st[node][type] += ln[node][type]; ln[node][type] = 0; if(ind < l || ind > r) return; if(l == r) { st[node][type] = max(st[node][type], val); return; } update(left,l,mid,ind,val,type); update(right,mid+1,r,ind,val,type); st[node][type] = max(st[left][type], st[right][type]); return; } void update(int node, int l, int r, int p, int q, int val, int type) { if(l > r) return; int mid = (l+r)>>1; int left = node<<1; int right = left|1; if(r > l) { ln[left][type] += ln[node][type]; ln[right][type] += ln[node][type]; } st[node][type] += ln[node][type]; ln[node][type] = 0; if(q < l || p > r) return; if(l >= p && r <= q) { st[node][type] += val; if(r > l) { ln[left][type] += val; ln[right][type] += val; } return; } update(left,l,mid,p,q,val,type); update(right,mid+1,r,p,q,val,type); st[node][type] = max(st[left][type], st[right][type]); return; } int query(int node, int l, int r, int p, int q, int type) { if(l > r || p > q) return 0; int mid = (l+r)>>1; int left = node<<1; int right = left|1; if(r > l) { ln[left][type] += ln[node][type]; ln[right][type] += ln[node][type]; } st[node][type] += ln[node][type]; ln[node][type] = 0; if(q < l || p > r) return 0; if(l >= p && r <= q) return st[node][type]; ll res = max(query(left,l,mid,p,q,type), query(right,mid+1,r,p,q,type)); st[node][type] = max(st[left][type], st[right][type]); return res; } void init(int n, int m) { int i; fo(i,0,n+1) { type[i] = 0; p[i] = mp(0,0); ans[i] = -1; } fo(i,0,m+1) { v[i][0].clear(); v[i][1].clear(); dp[i] = 0; } return; } int main() { sws; // clock_t clk; // clk = clock(); // io_file; // srand (time(NULL)); //Code here int t, n, i, m, j, k; char ch; mapp['E'] = 0; mapp['C'] = 0; mapp['D'] = 1; mapp['M'] = 1; cin >> t; while(t--) { cin >> m >> n; fo(i,1,n+1) { cin >> ch; type[i] = mapp[ch]; } fo(i,1,n+1) cin >> p[i].F; fo(i,1,n+1) { cin >> p[i].S; if(p[i].S > p[i].F) v[p[i].S][type[i]].pb(p[i].F); } // fo(i,1,m+1) // fo(j,0,2) // sort(all(v[i][j]),greater()); build(1,1,m); fo(i,1,m+1) { fo(j,0,2) fo(k,0,sz(v[i][j])) update(1,1,m,1,v[i][j][k],1,j); dp[i] = max(dp[i], max(query(1,1,m,1,i,0),query(1,1,m,1,i,1))); update(1,1,m,i,dp[i],0); update(1,1,m,i,dp[i],1); } fo(i,1,n+1) ans[i] = -1; j = 1; fo(i,1,m+1) { while(j <= dp[i]) { ans[j] = i; j++; } } fo(i,1,n+1) cout << ans[i] << " "; cout << '\n'; init(n,m); } // Code ends here // clk = clock() - clk; // cerr << fixed << setprecision(6) << "Time: " << ((double)clk)/CLOCKS_PER_SEC << "\n"; return 0; }