#include #define rep(i,start,lim) for(lld i=start;i=lim;i--) #define scan(x) scanf("%lld",&x) #define print(x) printf("%lld ",x) #define f first #define s second #define pb push_back #define mp make_pair #define br printf("\n") #define sz(a) lld((a).size()) #define YES printf("YES\n") #define NO printf("NO\n") #define all(c) (c).begin(),(c).end() using namespace std; #define INF 1011111111 #define LLINF 1000111000111000111LL #define EPS (double)1e-10 #define MOD 1000000007 #define PI 3.14159265358979323 using namespace std; typedef long double ldb; typedef long long lld; lld powm(lld base,lld exp,lld mod=MOD) {lld ans=1;while(exp){if(exp&1) ans=(ans*base)%mod;exp>>=1,base=(base*base)%mod;}return ans;} typedef vector vlld; typedef pair plld; typedef map mlld; typedef set slld; #define sync ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define endl '\n' #define N 50005 char t[N]; lld s[N],d[N]; //Fenwick Tree struct fenTree{ //Cat -> 0 Dog -> 1 lld tree[N],maxm; void init() { rep(i,0,N) tree[i] = 0; } void update(lld i,lld value) { for(;i<=N;i+=(i&-i)) tree[i]=max(tree[i],value); } lld query(lld i) { for(maxm=0;i>0;i-=(i&-i)) maxm=max(maxm,tree[i]); return maxm; } } ftdd,ftdc,ftcd,ftcc; vector> v; //End Start type lld dp[N],ans[N]; lld solve() { lld n,m,c=0; ftdd.init(),ftdc.init(),ftcc.init(),ftcd.init(); cin>>m>>n; v.clear(); rep(i,0,N) dp[i]=0,ans[i]=LLINF; rep(i,1,n+1) { cin>>t[i]; if(t[i]=='E') t[i]='C'; if(t[i]=='M') t[i]='D'; } rep(i,1,n+1) cin>>s[i]; rep(i,1,n+1) cin>>d[i]; rep(i,1,n+1) { if(t[i]=='C') v.pb({{d[i],s[i]},0LL}); else v.pb({{d[i],s[i]},1LL}); } sort(all(v)); for(auto i:v) { ++c; if(i.s) { //Dog dp[c] = max(dp[c],1+ftdd.query(i.f.s)); dp[c] = max(dp[c],1+ftdc.query(i.f.s)); ftdd.update(i.f.s,dp[c]); ftcd.update(i.f.f,dp[c]); } else { dp[c] = max(dp[c],1+ftcc.query(i.f.s)); dp[c] = max(dp[c],1+ftcd.query(i.f.s)); ftcc.update(i.f.s,dp[c]); ftdc.update(i.f.f,dp[c]); } } rep(i,1,n+1) ans[dp[i]] = min(ans[dp[i]],v[i-1].f.f); rep(i,1,n+1) cout<<(ans[i]==LLINF?-1:ans[i])<<" ";cout<>t; while(t--) { solve(); } return 0; }