/* 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 RangeHolder {
RangeHolder() {
map
= new TreeMap
<Double, Double
>(); }
Map.
Entry<Double, Double
> floor
= map.
floorEntry(rangeStart
); if (floor != null && floor.getValue() >= rangeStart) {
map.remove(floor.getKey());
rangeStart
= Math.
min(floor.
getKey(), rangeStart
); rangeEnd
= Math.
max(floor.
getValue(), rangeEnd
); }
Map.
Entry<Double, Double
> ceiling
= map.
ceilingEntry(rangeStart
); if (ceiling != null && ceiling.getKey() <= rangeEnd) {
map.remove(ceiling.getKey());
rangeEnd
= Math.
max(ceiling.
getValue(), rangeEnd
); }
map.put(rangeStart, rangeEnd);
return map.ceilingEntry(rangeStart);
}
/** Checks if the whole range is occupied -- no free areas */
Map.
Entry<Double, Double
> floor
= map.
floorEntry(rangeStart
); if (floor != null && floor.getValue() >= rangeStart) return false;
Map.
Entry<Double, Double
> ceiling
= map.
ceilingEntry(rangeStart
); if (ceiling != null && ceiling.getKey() <= rangeEnd) return false;
return true;
}
/** Checks if the whole range is free -- no occupied areas */
Map.
Entry<Double, Double
> floor
= map.
floorEntry(rangeStart
); if (floor != null && floor.getValue() >= rangeEnd) return true;
return false;
}
Map.
Entry<Double, Double
> floor
= map.
floorEntry(value
); if (floor.getValue() >= value) return floor;
return null;
}
return map.keySet().toArray(a);
}
}
public static void printRanges(RangeHolder rh) {
Double[] ranges
= rh.
getRangeStarts(); System.
out.
println("Ranges:"); System.
out.
println(" " + r
+ "..." + rh.
getRange(r
).
getValue()); };
}
public static void main
(String[] args
) { RangeHolder rh = new RangeHolder();
rh.occupy(1d, 2d);
rh.occupy(3d, 4d);
rh.occupy(5d, 6d);
printRanges(rh);
rh.occupy(2d, 3d);
printRanges(rh);
System.
out.
println("rh.isFree(0d,100d): " + rh.
isFree(0d,100d
)); System.
out.
println("rh.isFree(0d,0.2d): " + rh.
isFree(0d,0.2d
)); System.
out.
println("rh.isFree(0.5d,3d): " + rh.
isFree(0.5d,3d
)); System.
out.
println("rh.isFree(2d,3d): " + rh.
isFree(2d,3d
)); System.
out.
println("rh.isFree(3d,5d): " + rh.
isFree(3d,5d
)); System.
out.
println("rh.isFree(5d,7d): " + rh.
isFree(5d,7d
)); System.
out.
println("rh.isFree(7d,8d): " + rh.
isFree(7d,8d
));
System.
out.
println("rh.isOccupied(0d,100d): " + rh.
isOccupied(0d,100d
)); System.
out.
println("rh.isOccupied(0d,0.2d): " + rh.
isOccupied(0d,0.2d
)); System.
out.
println("rh.isOccupied(0.5d,3d): " + rh.
isOccupied(0.5d,3d
)); System.
out.
println("rh.isOccupied(2d,3d): " + rh.
isOccupied(2d,3d
)); System.
out.
println("rh.isOccupied(3d,5d): " + rh.
isOccupied(3d,5d
)); System.
out.
println("rh.isOccupied(5d,7d): " + rh.
isOccupied(5d,7d
)); System.
out.
println("rh.isOccupied(7d,8d): " + rh.
isOccupied(7d,8d
));
Map.
Entry<Double, Double
> range
= rh.
getRange(3d
); System.
out.
println("3 falls in range " + range.
getKey() + "..." + range.
getValue());
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICBzdGF0aWMgY2xhc3MgUmFuZ2VIb2xkZXIgewogICAgVHJlZU1hcDxEb3VibGUsIERvdWJsZT4gbWFwOwogICAgUmFuZ2VIb2xkZXIoKSB7CiAgICAgIG1hcCA9IG5ldyBUcmVlTWFwPERvdWJsZSwgRG91YmxlPigpOwogICAgfQogICAgCiAgICBNYXAuRW50cnk8RG91YmxlLCBEb3VibGU+IG9jY3VweShEb3VibGUgcmFuZ2VTdGFydCwgRG91YmxlIHJhbmdlRW5kKSB7CiAgICAgIE1hcC5FbnRyeTxEb3VibGUsIERvdWJsZT4gZmxvb3IgPSBtYXAuZmxvb3JFbnRyeShyYW5nZVN0YXJ0KTsKICAgICAgaWYgKGZsb29yICE9IG51bGwgJiYgZmxvb3IuZ2V0VmFsdWUoKSA+PSByYW5nZVN0YXJ0KSB7CiAgICAgICAgbWFwLnJlbW92ZShmbG9vci5nZXRLZXkoKSk7IAogICAgICAgIHJhbmdlU3RhcnQgPSBNYXRoLm1pbihmbG9vci5nZXRLZXkoKSwgcmFuZ2VTdGFydCk7CiAgICAgICAgcmFuZ2VFbmQgPSBNYXRoLm1heChmbG9vci5nZXRWYWx1ZSgpLCByYW5nZUVuZCk7CiAgICAgIH0KICAgICAgTWFwLkVudHJ5PERvdWJsZSwgRG91YmxlPiBjZWlsaW5nID0gbWFwLmNlaWxpbmdFbnRyeShyYW5nZVN0YXJ0KTsKICAgICAgaWYgKGNlaWxpbmcgIT0gbnVsbCAmJiBjZWlsaW5nLmdldEtleSgpIDw9IHJhbmdlRW5kKSB7CiAgICAgICAgbWFwLnJlbW92ZShjZWlsaW5nLmdldEtleSgpKTsgCiAgICAgICAgcmFuZ2VFbmQgPSBNYXRoLm1heChjZWlsaW5nLmdldFZhbHVlKCksIHJhbmdlRW5kKTsKICAgICAgfQogICAgICBtYXAucHV0KHJhbmdlU3RhcnQsIHJhbmdlRW5kKTsKICAgICAgcmV0dXJuIG1hcC5jZWlsaW5nRW50cnkocmFuZ2VTdGFydCk7CiAgICB9CiAgICAKICAgIC8qKiBDaGVja3MgaWYgdGhlIHdob2xlIHJhbmdlIGlzIG9jY3VwaWVkIC0tIG5vIGZyZWUgYXJlYXMgKi8KICAgIGJvb2xlYW4gaXNGcmVlKERvdWJsZSByYW5nZVN0YXJ0LCBEb3VibGUgcmFuZ2VFbmQpIHsKICAgICAgTWFwLkVudHJ5PERvdWJsZSwgRG91YmxlPiBmbG9vciA9IG1hcC5mbG9vckVudHJ5KHJhbmdlU3RhcnQpOwogICAgICBpZiAoZmxvb3IgIT0gbnVsbCAmJiBmbG9vci5nZXRWYWx1ZSgpID49IHJhbmdlU3RhcnQpIHJldHVybiBmYWxzZTsKICAgICAgTWFwLkVudHJ5PERvdWJsZSwgRG91YmxlPiBjZWlsaW5nID0gbWFwLmNlaWxpbmdFbnRyeShyYW5nZVN0YXJ0KTsKICAgICAgaWYgKGNlaWxpbmcgIT0gbnVsbCAmJiBjZWlsaW5nLmdldEtleSgpIDw9IHJhbmdlRW5kKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgCiAgICAvKiogQ2hlY2tzIGlmIHRoZSB3aG9sZSByYW5nZSBpcyBmcmVlIC0tIG5vIG9jY3VwaWVkIGFyZWFzICovCiAgICBib29sZWFuIGlzT2NjdXBpZWQoRG91YmxlIHJhbmdlU3RhcnQsIERvdWJsZSByYW5nZUVuZCkgewogICAgICBNYXAuRW50cnk8RG91YmxlLCBEb3VibGU+IGZsb29yID0gbWFwLmZsb29yRW50cnkocmFuZ2VTdGFydCk7CiAgICAgIGlmIChmbG9vciAhPSBudWxsICYmIGZsb29yLmdldFZhbHVlKCkgPj0gcmFuZ2VFbmQpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAKICAgIE1hcC5FbnRyeTxEb3VibGUsIERvdWJsZT4gZ2V0UmFuZ2UoRG91YmxlIHZhbHVlKSB7CiAgICAgIE1hcC5FbnRyeTxEb3VibGUsIERvdWJsZT4gZmxvb3IgPSBtYXAuZmxvb3JFbnRyeSh2YWx1ZSk7CiAgICAgIGlmIChmbG9vci5nZXRWYWx1ZSgpID49IHZhbHVlKSByZXR1cm4gZmxvb3I7CiAgICAgIHJldHVybiBudWxsOyAKICAgIH0gCgogICAgRG91YmxlW10gZ2V0UmFuZ2VTdGFydHMoKSB7CiAgICAgIERvdWJsZVtdIGEgPSBuZXcgRG91YmxlWzBdOwogICAgICByZXR1cm4gbWFwLmtleVNldCgpLnRvQXJyYXkoYSk7CiAgICB9CiAgfQoKICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRSYW5nZXMoUmFuZ2VIb2xkZXIgcmgpIHsKICAgIERvdWJsZVtdIHJhbmdlcyA9IHJoLmdldFJhbmdlU3RhcnRzKCk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJhbmdlczoiKTsKICAgIGZvciAoRG91YmxlIHI6IHJhbmdlcykgewogICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIiArIHIgKyAiLi4uIiArIHJoLmdldFJhbmdlKHIpLmdldFZhbHVlKCkpOwogICAgfTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogIH0KICAKICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICBSYW5nZUhvbGRlciByaCA9IG5ldyBSYW5nZUhvbGRlcigpOwogICAgcmgub2NjdXB5KDFkLCAyZCk7CiAgICByaC5vY2N1cHkoM2QsIDRkKTsKICAgIHJoLm9jY3VweSg1ZCwgNmQpOwogICAgcHJpbnRSYW5nZXMocmgpOwoKICAgIHJoLm9jY3VweSgyZCwgM2QpOwogICAgcHJpbnRSYW5nZXMocmgpOwogICAgCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzRnJlZSgwZCwxMDBkKTogIiArIHJoLmlzRnJlZSgwZCwxMDBkKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzRnJlZSgwZCwwLjJkKTogIiArIHJoLmlzRnJlZSgwZCwwLjJkKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzRnJlZSgwLjVkLDNkKTogIiArIHJoLmlzRnJlZSgwLjVkLDNkKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzRnJlZSgyZCwzZCk6ICIgKyByaC5pc0ZyZWUoMmQsM2QpKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmguaXNGcmVlKDNkLDVkKTogIiArIHJoLmlzRnJlZSgzZCw1ZCkpOwogICAgU3lzdGVtLm91dC5wcmludGxuKCJyaC5pc0ZyZWUoNWQsN2QpOiAiICsgcmguaXNGcmVlKDVkLDdkKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzRnJlZSg3ZCw4ZCk6ICIgKyByaC5pc0ZyZWUoN2QsOGQpKTsKICAgIAogICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzT2NjdXBpZWQoMGQsMTAwZCk6ICIgKyByaC5pc09jY3VwaWVkKDBkLDEwMGQpKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmguaXNPY2N1cGllZCgwZCwwLjJkKTogIiArIHJoLmlzT2NjdXBpZWQoMGQsMC4yZCkpOwogICAgU3lzdGVtLm91dC5wcmludGxuKCJyaC5pc09jY3VwaWVkKDAuNWQsM2QpOiAiICsgcmguaXNPY2N1cGllZCgwLjVkLDNkKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzT2NjdXBpZWQoMmQsM2QpOiAiICsgcmguaXNPY2N1cGllZCgyZCwzZCkpOwogICAgU3lzdGVtLm91dC5wcmludGxuKCJyaC5pc09jY3VwaWVkKDNkLDVkKTogIiArIHJoLmlzT2NjdXBpZWQoM2QsNWQpKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmguaXNPY2N1cGllZCg1ZCw3ZCk6ICIgKyByaC5pc09jY3VwaWVkKDVkLDdkKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJoLmlzT2NjdXBpZWQoN2QsOGQpOiAiICsgcmguaXNPY2N1cGllZCg3ZCw4ZCkpOwogICAgCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgIE1hcC5FbnRyeTxEb3VibGUsIERvdWJsZT4gcmFuZ2UgPSByaC5nZXRSYW5nZSgzZCk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjMgZmFsbHMgaW4gcmFuZ2UgIiArIHJhbmdlLmdldEtleSgpICsgIi4uLiIgKyByYW5nZS5nZXRWYWx1ZSgpKTsKCiAgfQoKfQ==