4
private final TreeSet<Interval> available;5
private final TreeSet<Integer> taken;7
public ExamRoom(int n) {12
var distA = getMinDistance(a);13
var distB = getMinDistance(b);14
return distA == distB ? a.s - b.s : distB - distA;16
this.available.add(new Interval(0, max));17
this.taken = new TreeSet<>();21
var inter = available.pollFirst();22
var idx = getInsertPosition(inter);24
if ((idx - 1) - inter.s >= 0) available.add(new Interval(inter.s, idx - 1));25
if (inter.e - (idx + 1) >= 0) available.add(new Interval(idx + 1, inter.e));29
public void leave(int p) {31
var lo = taken.lower(p);32
if (lo == null) lo = -1;33
var hi = taken.higher(p);34
if (hi == null) hi = max + 1;35
available.remove(new Interval(lo + 1, p - 1));36
available.remove(new Interval(p + 1, hi - 1));37
available.add(new Interval(lo + 1, hi - 1));40
private int getInsertPosition(Interval inter) {41
if (inter.s == 0) return 0;42
else if (inter.e == max) return max;43
else return inter.s + (inter.e - inter.s) / 2;46
private int getMinDistance(Interval in) {47
return in.s == 0 || in.e == max ? in.e - in.s : (in.e - in.s) / 2;50
private final class Interval {54
Interval(int s, int e) {60
public String toString() {61
return "[" + s + "," + e + "]";