import java.io.*; import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; public class Solution { static int determineMin(ArrayList array) { Collections.sort(array); return array.get(0); } static int[] minimumZooNumbers(int m, int n, char[] t, int[] s, int[] d) { // Return a list of length n consisting of the answers int[] result = new int[n]; TreeMap> dogsAndMice = new TreeMap>(); TreeMap> elephantsAndCats = new TreeMap>(); int maxDest = 0; for (int i = 0; i < n; i++) { if (t[i] == 'D' || t[i] == 'M') { maxDest = Math.max(s[i], d[i]); if (dogsAndMice.containsKey(maxDest)) { dogsAndMice.get(maxDest).add(i); } else { ArrayList newIndicesArray = new ArrayList(); newIndicesArray.add(i); dogsAndMice.put(maxDest, newIndicesArray); } } else { maxDest = Math.max(s[i], d[i]); if (elephantsAndCats.containsKey(maxDest)) { elephantsAndCats.get(maxDest).add(i); } else { ArrayList newIndicesArray = new ArrayList(); newIndicesArray.add(i); elephantsAndCats.put(maxDest, newIndicesArray); } } } //System.out.println("dogs and mice "+dogsAndMice.toString()); //System.out.println("eleph and cats "+elephantsAndCats.toString()); TreeSet dogsKeySet = new TreeSet(dogsAndMice.keySet()); TreeSet elephantsKeySet = new TreeSet(elephantsAndCats.keySet()); //keySet.addAll(elephantsKeySet); //System.out.println(keySet.toString()); int elementscounter = 0; for (int i = 1; i <= n; i++) { int minimumNumberForElephAndCats = -1; int minimumNumberForDogsAndMice = -1; int numbOfAnimalsSofarForElephAndCats = 0; int numbOfAnimalsSofarForDogsAndMice = 0; for (Integer key : elephantsKeySet) { if (numbOfAnimalsSofarForElephAndCats < i) { elementscounter = 0; while ((numbOfAnimalsSofarForElephAndCats < i) && (elementscounter < (elephantsAndCats.get(key).size()))) { minimumNumberForElephAndCats = key; numbOfAnimalsSofarForElephAndCats++; elementscounter++; } int lowerLimitDogs = 0; if (dogsAndMice.ceilingKey(key + 1) != null) { lowerLimitDogs = dogsAndMice.ceilingKey(key + 1); } if (numbOfAnimalsSofarForElephAndCats < i && minimumNumberForElephAndCats < lowerLimitDogs) { int upperLimitDogs = Integer.MAX_VALUE; if (elephantsKeySet.ceiling(key + 1) != null) { upperLimitDogs = elephantsKeySet.ceiling(key + 1); } elementscounter = 0; while ((numbOfAnimalsSofarForElephAndCats < i) && (lowerLimitDogs < upperLimitDogs) && (elementscounter < dogsAndMice.get(lowerLimitDogs).size())) { int sourceIndex = s[dogsAndMice.get(lowerLimitDogs).get(elementscounter)]; int min = Integer.MAX_VALUE; if (upperLimitDogs != Integer.MAX_VALUE) { ArrayList sourceArray = new ArrayList(); for (Integer integer : elephantsAndCats.get(upperLimitDogs)) { sourceArray.add(integer); } min = determineMin(sourceArray); } if (sourceIndex >= key && (lowerLimitDogs <= min || ((numbOfAnimalsSofarForElephAndCats + dogsAndMice.get(lowerLimitDogs).size() - elementscounter) >= i))) { minimumNumberForElephAndCats = lowerLimitDogs; numbOfAnimalsSofarForElephAndCats++; } elementscounter++; if (elementscounter == dogsAndMice.get(lowerLimitDogs).size() && dogsKeySet.ceiling(lowerLimitDogs + 1) != null) { lowerLimitDogs = dogsKeySet.ceiling(lowerLimitDogs + 1); elementscounter = 0; } } } } else { break; } } if (numbOfAnimalsSofarForElephAndCats < i) { minimumNumberForElephAndCats = -1; } //System.out.println("minimum shelter to visit after elephant and cats:"+minimumNumberForElephAndCats); //System.out.println("number of animals so far after elephant and cats:"+numbOfAnimalsSofarForElephAndCats); for (Integer key : dogsKeySet) { if (numbOfAnimalsSofarForDogsAndMice < i) { elementscounter = 0; while ((numbOfAnimalsSofarForDogsAndMice < i) && (elementscounter < (dogsAndMice.get(key).size()))) { minimumNumberForDogsAndMice = key; numbOfAnimalsSofarForDogsAndMice++; elementscounter++; // // } } else { break; } } if (numbOfAnimalsSofarForDogsAndMice < i) { minimumNumberForDogsAndMice = -1; } //System.out.println("minimum shelter to visit after dogs and mice:"+minimumNumberForDogsAndMice); //System.out.println("number of animals so far after dogs and mice:"+numbOfAnimalsSofarForDogsAndMice); if (minimumNumberForDogsAndMice == -1 || minimumNumberForElephAndCats == -1) { result[i-1] = Math.max(minimumNumberForDogsAndMice, minimumNumberForElephAndCats); } else { result[i-1] = Math.min(minimumNumberForDogsAndMice, minimumNumberForElephAndCats); } } return result; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int cases = in.nextInt(); for(int a0 = 0; a0 < cases; a0++){ int m = in.nextInt(); int n = in.nextInt(); char[] t = new char[n]; for(int t_i = 0; t_i < n; t_i++){ t[t_i] = in.next().charAt(0); } int[] s = new int[n]; for(int s_i = 0; s_i < n; s_i++){ s[s_i] = in.nextInt(); } int[] d = new int[n]; for(int d_i = 0; d_i < n; d_i++){ d[d_i] = in.nextInt(); } int[] result = minimumZooNumbers(m, n, t, s, d); for (int i = 0; i < result.length; i++) { System.out.print(result[i] + (i != result.length - 1 ? " " : "")); } System.out.println(""); } in.close(); } }