import java.util.*;
class MapReduce {
private Map
<Integer, HashSet
<String
>> intermediate
= new LinkedHashMap
<>(); private Set<Integer> finalResult = new HashSet<>();
Set<Integer> execute(int[] R, int[] S) {
for (int aR : R) {
mapper(aR, "R");
}
for (int aS : S) {
mapper(aS, "S");
}
Iterator it
= intermediate.
entrySet().
iterator(); while (it.hasNext()) {
reducer(pair.getKey(), pair.getValue());
it.remove();
}
return finalResult;
}
private void emit(int obj) {
finalResult.add(obj);
}
private void reducer
(int key,
HashSet value
) { // Fill up the question mark in the reducer function!
if (value.size() == 2) {
emit(key);
}
}
private void mapper
(int key,
String value
) { emitIntermediate(key, value);
}
private void emitIntermediate
(int key,
String value
) { if (intermediate.containsKey(key)) {
intermediate.get(key).add(value);
return;
}
intermediate.put(key, new HashSet<String>() {{
add(value);
}});
}
}
public class Main {
public static void main
(String[] arg
) {
Scanner sc
= new Scanner
(System.
in); int Nr = sc.nextInt();
int Ns = sc.nextInt();
int[] R = new int[Nr];
int[] S = new int[Ns];
for (int i = 0; i < Nr; i++) {
R[i] = sc.nextInt();
}
for (int i = 0; i < Ns; i++) {
S[i] = sc.nextInt();
}
MapReduce mapReduceJob = new MapReduce();
Set<Integer> result = mapReduceJob.execute(R, S);
result.
forEach(System.
out::println
); }
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgTWFwUmVkdWNlIHsKCiAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBIYXNoU2V0PFN0cmluZz4+IGludGVybWVkaWF0ZSA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgIHByaXZhdGUgU2V0PEludGVnZXI+IGZpbmFsUmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOwoKICAgIFNldDxJbnRlZ2VyPiBleGVjdXRlKGludFtdIFIsIGludFtdIFMpIHsKICAgICAgICBmb3IgKGludCBhUiA6IFIpIHsKICAgICAgICAgICAgbWFwcGVyKGFSLCAiUiIpOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBhUyA6IFMpIHsKICAgICAgICAgICAgbWFwcGVyKGFTLCAiUyIpOwogICAgICAgIH0KCiAgICAgICAgSXRlcmF0b3IgaXQgPSBpbnRlcm1lZGlhdGUuZW50cnlTZXQoKS5pdGVyYXRvcigpOwogICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEhhc2hTZXQ8U3RyaW5nPj4gcGFpciA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKICAgICAgICAgICAgcmVkdWNlcihwYWlyLmdldEtleSgpLCBwYWlyLmdldFZhbHVlKCkpOwogICAgICAgICAgICBpdC5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBlbWl0KGludCBvYmopIHsKICAgICAgICBmaW5hbFJlc3VsdC5hZGQob2JqKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcmVkdWNlcihpbnQga2V5LCBIYXNoU2V0IHZhbHVlKSB7CiAgICAgICAgLy8gRmlsbCB1cCB0aGUgcXVlc3Rpb24gbWFyayBpbiB0aGUgcmVkdWNlciBmdW5jdGlvbiEKICAgICAgICBpZiAodmFsdWUuc2l6ZSgpID09IDIpIHsKICAgICAgICAgICAgZW1pdChrZXkpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgbWFwcGVyKGludCBrZXksIFN0cmluZyB2YWx1ZSkgewogICAgICAgIGVtaXRJbnRlcm1lZGlhdGUoa2V5LCB2YWx1ZSk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGVtaXRJbnRlcm1lZGlhdGUoaW50IGtleSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgaWYgKGludGVybWVkaWF0ZS5jb250YWluc0tleShrZXkpKSB7CiAgICAgICAgICAgIGludGVybWVkaWF0ZS5nZXQoa2V5KS5hZGQodmFsdWUpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGludGVybWVkaWF0ZS5wdXQoa2V5LCBuZXcgSGFzaFNldDxTdHJpbmc+KCkge3sKICAgICAgICAgICAgYWRkKHZhbHVlKTsKICAgICAgICB9fSk7CiAgICB9Cn0KCnB1YmxpYyBjbGFzcyBNYWluIHsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmcpIHsKCiAgICAgICAgU2Nhbm5lciBzYyA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CiAgICAgICAgaW50IE5yID0gc2MubmV4dEludCgpOwogICAgICAgIGludCBOcyA9IHNjLm5leHRJbnQoKTsKICAgICAgICBpbnRbXSBSID0gbmV3IGludFtOcl07CiAgICAgICAgaW50W10gUyA9IG5ldyBpbnRbTnNdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnI7IGkrKykgewogICAgICAgICAgICBSW2ldID0gc2MubmV4dEludCgpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOczsgaSsrKSB7CiAgICAgICAgICAgIFNbaV0gPSBzYy5uZXh0SW50KCk7CiAgICAgICAgfQoKICAgICAgICBNYXBSZWR1Y2UgbWFwUmVkdWNlSm9iID0gbmV3IE1hcFJlZHVjZSgpOwogICAgICAgIFNldDxJbnRlZ2VyPiByZXN1bHQgPSBtYXBSZWR1Y2VKb2IuZXhlY3V0ZShSLCBTKTsKCiAgICAgICAgcmVzdWx0LmZvckVhY2goU3lzdGVtLm91dDo6cHJpbnRsbik7CiAgICB9Cgp9