/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
static class RandomSet<E> extends AbstractSet<E> {
List<E> dta = new ArrayList<E>();
Map<E, Integer> idx = new HashMap<E, Integer>();
public RandomSet() {
}
public RandomSet(Collection<E> items) {
for (E item : items) {
idx.put(item, dta.size());
dta.add(item);
}
}
@Override
public boolean add(E item) {
if (idx.containsKey(item)) {
return false;
}
idx.put(item, dta.size());
dta.add(item);
return true;
}
/**
* Override element at position <code>id</code> with last element.
* @param id
*/
public E removeAt(int id) {
if (id >= dta.size()) {
return null;
}
E res = dta.get(id);
idx.remove(res);
E last = dta.remove(dta.size() - 1);
// skip filling the hole if last is removed
if (id < dta.size()) {
idx.put(last, id);
dta.set(id, last);
}
return res;
}
@Override
public boolean remove
(Object item
) { @SuppressWarnings(value = "element-type-mismatch")
if (id == null) {
return false;
}
removeAt(id);
return true;
}
public E get(int i) {
return dta.get(i);
}
public E pollRandom
(Random rnd
) { if (dta.isEmpty()) {
return null;
}
int id = rnd.nextInt(dta.size());
return removeAt(id);
}
@Override
public int size() {
return dta.size();
}
@Override
public Iterator<E> iterator() {
return dta.iterator();
}
}
{
RandomSet<Integer> rs = new RandomSet<Integer>();
for (int i = 0; i < 20; ++i) {
rs.add(i);
}
int count = 50;
for (int i = 0; i < count; i++) {
System.
out.
println(rs.
pollRandom(r
)); rs.remove(i);
rs.add(i + 20);
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICAgIHN0YXRpYyBjbGFzcyBSYW5kb21TZXQ8RT4gZXh0ZW5kcyBBYnN0cmFjdFNldDxFPiB7CgogICAgICAgIExpc3Q8RT4gZHRhID0gbmV3IEFycmF5TGlzdDxFPigpOwogICAgICAgIE1hcDxFLCBJbnRlZ2VyPiBpZHggPSBuZXcgSGFzaE1hcDxFLCBJbnRlZ2VyPigpOwoKICAgICAgICBwdWJsaWMgUmFuZG9tU2V0KCkgewogICAgICAgIH0KCiAgICAgICAgcHVibGljIFJhbmRvbVNldChDb2xsZWN0aW9uPEU+IGl0ZW1zKSB7CiAgICAgICAgICAgIGZvciAoRSBpdGVtIDogaXRlbXMpIHsKICAgICAgICAgICAgICAgIGlkeC5wdXQoaXRlbSwgZHRhLnNpemUoKSk7CiAgICAgICAgICAgICAgICBkdGEuYWRkKGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBpdGVtKSB7CiAgICAgICAgICAgIGlmIChpZHguY29udGFpbnNLZXkoaXRlbSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZHgucHV0KGl0ZW0sIGR0YS5zaXplKCkpOwogICAgICAgICAgICBkdGEuYWRkKGl0ZW0pOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlIGVsZW1lbnQgYXQgcG9zaXRpb24gPGNvZGU+aWQ8L2NvZGU+IHdpdGggbGFzdCBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSBpZAogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBFIHJlbW92ZUF0KGludCBpZCkgewogICAgICAgICAgICBpZiAoaWQgPj0gZHRhLnNpemUoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgRSByZXMgPSBkdGEuZ2V0KGlkKTsKICAgICAgICAgICAgaWR4LnJlbW92ZShyZXMpOwogICAgICAgICAgICBFIGxhc3QgPSBkdGEucmVtb3ZlKGR0YS5zaXplKCkgLSAxKTsKICAgICAgICAgICAgLy8gc2tpcCBmaWxsaW5nIHRoZSBob2xlIGlmIGxhc3QgaXMgcmVtb3ZlZAogICAgICAgICAgICBpZiAoaWQgPCBkdGEuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICBpZHgucHV0KGxhc3QsIGlkKTsKICAgICAgICAgICAgICAgIGR0YS5zZXQoaWQsIGxhc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IGl0ZW0pIHsKICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3ModmFsdWUgPSAiZWxlbWVudC10eXBlLW1pc21hdGNoIikKICAgICAgICAgICAgSW50ZWdlciBpZCA9IGlkeC5nZXQoaXRlbSk7CiAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlQXQoaWQpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBFIGdldChpbnQgaSkgewogICAgICAgICAgICByZXR1cm4gZHRhLmdldChpKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBFIHBvbGxSYW5kb20oUmFuZG9tIHJuZCkgewogICAgICAgICAgICBpZiAoZHRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGlkID0gcm5kLm5leHRJbnQoZHRhLnNpemUoKSk7CiAgICAgICAgICAgIHJldHVybiByZW1vdmVBdChpZCk7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgICAgIHJldHVybiBkdGEuc2l6ZSgpOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewogICAgICAgICAgICByZXR1cm4gZHRhLml0ZXJhdG9yKCk7CiAgICAgICAgfQogICAgfQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAgICB7CiAgICAgICAgUmFuZG9tU2V0PEludGVnZXI+IHJzID0gbmV3IFJhbmRvbVNldDxJbnRlZ2VyPigpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgewogICAgICAgICAgICBycy5hZGQoaSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgY291bnQgPSA1MDsKCiAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocnMucG9sbFJhbmRvbShyKSk7CiAgICAgICAgICAgIHJzLnJlbW92ZShpKTsKICAgICAgICAgICAgcnMuYWRkKGkgKyAyMCk7CiAgICAgICAgfQogICAgfQp9