import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
public class Main {
@SafeVarargs
private static <T> Iterator<T> from(T... array) {
return Arrays.
asList(array
).
iterator(); }
@SafeVarargs
private static <T> void testSuperIterator(List<T> expected, Comparator<T> comparator, Iterator<T>... iterators) {
final SuperIterator
<T
> superIterator
= new SuperIterator
<T
>(Arrays.
asList(iterators
), comparator
); final List<T> actual = new ArrayList<>(expected.size());
while (superIterator.hasNext()) {
actual.add(superIterator.next());
}
if (!actual.equals(expected)) {
}
}
private static Comparator
<Integer
> INTEGER_COMPARATOR
= Integer::compareTo
;
@SafeVarargs
private static void testIntSuperIterator(List<Integer> expected, Iterator<Integer>... iterators) {
testSuperIterator(expected, INTEGER_COMPARATOR, iterators);
}
@Override
public boolean hasNext() {
return false;
}
@Override
}
};
private static <T> Iterator<T> emptyIterator() {
//noinspection unchecked
return EMPTY_ITERATOR_INSTANCE;
}
static class SuperIterator<T> implements Iterator<T> {
private final Iterator<T>[] iterators;
private final Object[] peekedElements
;
private final Comparator<T> comparator;
public SuperIterator(Collection<Iterator<T>> iterators, Comparator<T> comparator) {
//noinspection unchecked
final Iterator<T>[] iteratorsArray = (Iterator<T>[]) iterators.toArray();
this.iterators = iteratorsArray;
this.
peekedElements = new Object[iteratorsArray.
length]; this.comparator = comparator;
}
@Override
public boolean hasNext() {
for (Object peekedElement
: peekedElements
) { if (peekedElement != null) {
return true;
}
}
final Iterator<T>[] iterators = this.iterators;
for (int i = 0; i < iterators.length; i++) {
final Iterator<T> iterator = iterators[i];
if (iterator != null) {
if (iterator.hasNext()) {
return true;
} else {
iterators[i] = null;
}
}
}
return false;
}
@Override
public T next() {
final Iterator<T>[] iterators = this.iterators;
final Object[] peekedElements
= this.
peekedElements;
final int length = iterators.length;
int minValuePosition = -1;
T minValue = null;
for (int i = 0; i < length; i++) {
//noinspection unchecked
T peekedElement = (T) peekedElements[i];
if (peekedElement == null) {
final Iterator<T> iterator = iterators[i];
if (iterator != null) {
if (iterator.hasNext()) {
peekedElements[i] = peekedElement = iterator.next();
} else {
iterators[i] = null;
}
}
}
if (peekedElement != null && (minValuePosition < 0 || comparator.compare(peekedElement, minValue) < 0)) {
minValuePosition = i;
minValue = peekedElement;
}
}
if (minValuePosition < 0) {
}
peekedElements[minValuePosition] = null;
return minValue;
}
}
public static void main
(String[] args
) { testIntSuperIterator(
emptyIterator()
);
testIntSuperIterator(
from(1)
);
testIntSuperIterator(
);
testIntSuperIterator(
from(1, 2, 4, 5)
);
testIntSuperIterator(
from
(Integer.
MIN_VALUE,
1,
2,
4,
5) );
testIntSuperIterator(
emptyIterator(), from(1, 2, 4, 5)
);
testIntSuperIterator(
from(1, 2, 4, 5), emptyIterator()
);
testIntSuperIterator(
emptyIterator
(), from
(Integer.
MIN_VALUE,
1,
2,
4,
5) );
testIntSuperIterator(
from
(Integer.
MIN_VALUE,
1,
2,
4,
5), emptyIterator
() );
testIntSuperIterator(
from(5), from(4), from(1), from(2)
);
testIntSuperIterator(
from(1, 5), from(4), from(1), from(2)
);
testIntSuperIterator(
Arrays.
asList(1,
1,
2,
2,
2,
4,
5),
from(1, 2, 2, 5), from(4), from(1), from(2)
);
testIntSuperIterator(
from
(1,
2,
5), from
(4,
Integer.
MAX_VALUE), from
(1), from
(2,
2,
Integer.
MAX_VALUE) );
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CgpwdWJsaWMgY2xhc3MgTWFpbiB7CgogICAgQFNhZmVWYXJhcmdzCiAgICBwcml2YXRlIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gZnJvbShULi4uIGFycmF5KSB7CiAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoYXJyYXkpLml0ZXJhdG9yKCk7CiAgICB9CgogICAgQFNhZmVWYXJhcmdzCiAgICBwcml2YXRlIHN0YXRpYyA8VD4gdm9pZCB0ZXN0U3VwZXJJdGVyYXRvcihMaXN0PFQ+IGV4cGVjdGVkLCBDb21wYXJhdG9yPFQ+IGNvbXBhcmF0b3IsIEl0ZXJhdG9yPFQ+Li4uIGl0ZXJhdG9ycykgewogICAgICAgIGZpbmFsIFN1cGVySXRlcmF0b3I8VD4gc3VwZXJJdGVyYXRvciA9IG5ldyBTdXBlckl0ZXJhdG9yPFQ+KEFycmF5cy5hc0xpc3QoaXRlcmF0b3JzKSwgY29tcGFyYXRvcik7CiAgICAgICAgZmluYWwgTGlzdDxUPiBhY3R1YWwgPSBuZXcgQXJyYXlMaXN0PD4oZXhwZWN0ZWQuc2l6ZSgpKTsKICAgICAgICB3aGlsZSAoc3VwZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgYWN0dWFsLmFkZChzdXBlckl0ZXJhdG9yLm5leHQoKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkOiAiICsgZXhwZWN0ZWQgKyAiISBBY3R1YWw6ICIgKyBhY3R1YWwpOwogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYWN0dWFsKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBDb21wYXJhdG9yPEludGVnZXI+IElOVEVHRVJfQ09NUEFSQVRPUiA9IEludGVnZXI6OmNvbXBhcmVUbzsKCiAgICBAU2FmZVZhcmFyZ3MKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEludFN1cGVySXRlcmF0b3IoTGlzdDxJbnRlZ2VyPiBleHBlY3RlZCwgSXRlcmF0b3I8SW50ZWdlcj4uLi4gaXRlcmF0b3JzKSB7CiAgICAgICAgdGVzdFN1cGVySXRlcmF0b3IoZXhwZWN0ZWQsIElOVEVHRVJfQ09NUEFSQVRPUiwgaXRlcmF0b3JzKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBJdGVyYXRvciBFTVBUWV9JVEVSQVRPUl9JTlNUQU5DRSA9IG5ldyBJdGVyYXRvcigpIHsKICAgICAgICAKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgfTsKCiAgICBwcml2YXRlIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gZW1wdHlJdGVyYXRvcigpIHsKICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKICAgICAgICByZXR1cm4gRU1QVFlfSVRFUkFUT1JfSU5TVEFOQ0U7CiAgICB9CgogICAgc3RhdGljIGNsYXNzIFN1cGVySXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CgogICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD5bXSBpdGVyYXRvcnM7CgogICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gcGVla2VkRWxlbWVudHM7CgogICAgICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxUPiBjb21wYXJhdG9yOwoKICAgICAgICBwdWJsaWMgU3VwZXJJdGVyYXRvcihDb2xsZWN0aW9uPEl0ZXJhdG9yPFQ+PiBpdGVyYXRvcnMsIENvbXBhcmF0b3I8VD4gY29tcGFyYXRvcikgewogICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8VD5bXSBpdGVyYXRvcnNBcnJheSA9IChJdGVyYXRvcjxUPltdKSBpdGVyYXRvcnMudG9BcnJheSgpOwogICAgICAgICAgICB0aGlzLml0ZXJhdG9ycyA9IGl0ZXJhdG9yc0FycmF5OwogICAgICAgICAgICB0aGlzLnBlZWtlZEVsZW1lbnRzID0gbmV3IE9iamVjdFtpdGVyYXRvcnNBcnJheS5sZW5ndGhdOwogICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgZm9yIChPYmplY3QgcGVla2VkRWxlbWVudCA6IHBlZWtlZEVsZW1lbnRzKSB7CiAgICAgICAgICAgICAgICBpZiAocGVla2VkRWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFQ+W10gaXRlcmF0b3JzID0gdGhpcy5pdGVyYXRvcnM7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0b3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvciA9IGl0ZXJhdG9yc1tpXTsKICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcnNbaV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFQgbmV4dCgpIHsKICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8VD5bXSBpdGVyYXRvcnMgPSB0aGlzLml0ZXJhdG9yczsKICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gcGVla2VkRWxlbWVudHMgPSB0aGlzLnBlZWtlZEVsZW1lbnRzOwoKICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGl0ZXJhdG9ycy5sZW5ndGg7CiAgICAgICAgICAgIGludCBtaW5WYWx1ZVBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgIFQgbWluVmFsdWUgPSBudWxsOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKICAgICAgICAgICAgICAgIFQgcGVla2VkRWxlbWVudCA9IChUKSBwZWVrZWRFbGVtZW50c1tpXTsKICAgICAgICAgICAgICAgIGlmIChwZWVrZWRFbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvciA9IGl0ZXJhdG9yc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVrZWRFbGVtZW50c1tpXSA9IHBlZWtlZEVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcnNbaV0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBlZWtlZEVsZW1lbnQgIT0gbnVsbCAmJiAobWluVmFsdWVQb3NpdGlvbiA8IDAgfHwgY29tcGFyYXRvci5jb21wYXJlKHBlZWtlZEVsZW1lbnQsIG1pblZhbHVlKSA8IDApKSB7CiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVQb3NpdGlvbiA9IGk7CiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUgPSBwZWVrZWRFbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobWluVmFsdWVQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBlZWtlZEVsZW1lbnRzW21pblZhbHVlUG9zaXRpb25dID0gbnVsbDsKCiAgICAgICAgICAgIHJldHVybiBtaW5WYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIHRlc3RJbnRTdXBlckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksCiAgICAgICAgICAgICAgICBlbXB0eUl0ZXJhdG9yKCkKICAgICAgICApOwoKICAgICAgICB0ZXN0SW50U3VwZXJJdGVyYXRvcigKICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoMSksCiAgICAgICAgICAgICAgICBmcm9tKDEpCiAgICAgICAgKTsKCiAgICAgICAgdGVzdEludFN1cGVySXRlcmF0b3IoCiAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEludGVnZXIuTUlOX1ZBTFVFKSwKICAgICAgICAgICAgICAgIGZyb20oSW50ZWdlci5NSU5fVkFMVUUpCiAgICAgICAgKTsKCiAgICAgICAgdGVzdEludFN1cGVySXRlcmF0b3IoCiAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KDEsIDIsIDQsIDUpLAogICAgICAgICAgICAgICAgZnJvbSgxLCAyLCA0LCA1KQogICAgICAgICk7CgogICAgICAgIHRlc3RJbnRTdXBlckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChJbnRlZ2VyLk1JTl9WQUxVRSwgMSwgMiwgNCwgNSksCiAgICAgICAgICAgICAgICBmcm9tKEludGVnZXIuTUlOX1ZBTFVFLCAxLCAyLCA0LCA1KQogICAgICAgICk7CgogICAgICAgIHRlc3RJbnRTdXBlckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgxLCAyLCA0LCA1KSwKICAgICAgICAgICAgICAgIGVtcHR5SXRlcmF0b3IoKSwgZnJvbSgxLCAyLCA0LCA1KQogICAgICAgICk7CgogICAgICAgIHRlc3RJbnRTdXBlckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgxLCAyLCA0LCA1KSwKICAgICAgICAgICAgICAgIGZyb20oMSwgMiwgNCwgNSksIGVtcHR5SXRlcmF0b3IoKQogICAgICAgICk7CgogICAgICAgIHRlc3RJbnRTdXBlckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChJbnRlZ2VyLk1JTl9WQUxVRSwgMSwgMiwgNCwgNSksCiAgICAgICAgICAgICAgICBlbXB0eUl0ZXJhdG9yKCksIGZyb20oSW50ZWdlci5NSU5fVkFMVUUsIDEsIDIsIDQsIDUpCiAgICAgICAgKTsKCiAgICAgICAgdGVzdEludFN1cGVySXRlcmF0b3IoCiAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEludGVnZXIuTUlOX1ZBTFVFLCAxLCAyLCA0LCA1KSwKICAgICAgICAgICAgICAgIGZyb20oSW50ZWdlci5NSU5fVkFMVUUsIDEsIDIsIDQsIDUpLCBlbXB0eUl0ZXJhdG9yKCkKICAgICAgICApOwoKICAgICAgICB0ZXN0SW50U3VwZXJJdGVyYXRvcigKICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoMSwgMiwgNCwgNSksCiAgICAgICAgICAgICAgICBmcm9tKDUpLCBmcm9tKDQpLCBmcm9tKDEpLCBmcm9tKDIpCiAgICAgICAgKTsKCiAgICAgICAgdGVzdEludFN1cGVySXRlcmF0b3IoCiAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KDEsIDEsIDIsIDQsIDUpLAogICAgICAgICAgICAgICAgZnJvbSgxLCA1KSwgZnJvbSg0KSwgZnJvbSgxKSwgZnJvbSgyKQogICAgICAgICk7CgogICAgICAgIHRlc3RJbnRTdXBlckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgxLCAxLCAyLCAyLCAyLCA0LCA1KSwKICAgICAgICAgICAgICAgIGZyb20oMSwgMiwgMiwgNSksIGZyb20oNCksIGZyb20oMSksIGZyb20oMikKICAgICAgICApOwoKICAgICAgICB0ZXN0SW50U3VwZXJJdGVyYXRvcigKICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoMSwgMSwgMiwgMiwgMiwgNCwgNSwgSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKSwKICAgICAgICAgICAgICAgIGZyb20oMSwgMiwgNSksIGZyb20oNCwgSW50ZWdlci5NQVhfVkFMVUUpLCBmcm9tKDEpLCBmcm9tKDIsIDIsIEludGVnZXIuTUFYX1ZBTFVFKQogICAgICAgICk7CiAgICB9Cn0K