/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class Interval {
int start, end;
start = s;
end = e;
train = t;
platform = p;
}
}
class TrainPlatformManager {
Map
<String, TreeMap
<Integer, Interval
>> platformMap
= new HashMap
<>(); Map
<String, TreeMap
<Integer, Interval
>> trainMap
= new HashMap
<>();
// Assign train to platform
public boolean assignTrain
(String train,
String platform,
int start,
int end
) { if (start >= end) return false;
platformMap.putIfAbsent(platform, new TreeMap<>());
TreeMap
<Integer, Interval
> pm
= platformMap.
get(platform
);
// conflict check
Map.
Entry<Integer, Interval
> floor
= pm.
floorEntry(start
); if (floor != null && floor.getValue().end > start) return false;
Map.
Entry<Integer, Interval
> ceil
= pm.
ceilingEntry(start
); if (ceil != null && end > ceil.getKey()) return false;
Interval interval = new Interval(start, end, train, platform);
pm.put(start, interval);
trainMap.putIfAbsent(train, new TreeMap<>());
trainMap.get(train).put(start, interval);
return true;
}
// Platform + time -> train
public String getTrainAtPlatform
(String platform,
int time
) { TreeMap
<Integer, Interval
> pm
= platformMap.
get(platform
); if (pm == null) return null;
Map.
Entry<Integer, Interval
> e
= pm.
floorEntry(time
); if (e == null || time >= e.getValue().end) return null;
return e.getValue().train;
}
// Train + time -> platform
TreeMap
<Integer, Interval
> tm
= trainMap.
get(train
); if (tm == null) return null;
Map.
Entry<Integer, Interval
> e
= tm.
floorEntry(time
); if (e == null || time >= e.getValue().end) return null;
return e.getValue().platform;
}
}
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
// your code goes here
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJbnRlcnZhbCB7CiAgICBpbnQgc3RhcnQsIGVuZDsKICAgIFN0cmluZyB0cmFpbiwgcGxhdGZvcm07CgogICAgSW50ZXJ2YWwoaW50IHMsIGludCBlLCBTdHJpbmcgdCwgU3RyaW5nIHApIHsKICAgICAgICBzdGFydCA9IHM7CiAgICAgICAgZW5kID0gZTsKICAgICAgICB0cmFpbiA9IHQ7CiAgICAgICAgcGxhdGZvcm0gPSBwOwogICAgfQp9CgpjbGFzcyBUcmFpblBsYXRmb3JtTWFuYWdlciB7CgogICAgTWFwPFN0cmluZywgVHJlZU1hcDxJbnRlZ2VyLCBJbnRlcnZhbD4+IHBsYXRmb3JtTWFwID0gbmV3IEhhc2hNYXA8PigpOwogICAgTWFwPFN0cmluZywgVHJlZU1hcDxJbnRlZ2VyLCBJbnRlcnZhbD4+IHRyYWluTWFwID0gbmV3IEhhc2hNYXA8PigpOwoKICAgIC8vIEFzc2lnbiB0cmFpbiB0byBwbGF0Zm9ybQogICAgcHVibGljIGJvb2xlYW4gYXNzaWduVHJhaW4oU3RyaW5nIHRyYWluLCBTdHJpbmcgcGxhdGZvcm0sIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgIGlmIChzdGFydCA+PSBlbmQpIHJldHVybiBmYWxzZTsKCiAgICAgICAgcGxhdGZvcm1NYXAucHV0SWZBYnNlbnQocGxhdGZvcm0sIG5ldyBUcmVlTWFwPD4oKSk7CiAgICAgICAgVHJlZU1hcDxJbnRlZ2VyLCBJbnRlcnZhbD4gcG0gPSBwbGF0Zm9ybU1hcC5nZXQocGxhdGZvcm0pOwoKICAgICAgICAvLyBjb25mbGljdCBjaGVjawogICAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlcnZhbD4gZmxvb3IgPSBwbS5mbG9vckVudHJ5KHN0YXJ0KTsKICAgICAgICBpZiAoZmxvb3IgIT0gbnVsbCAmJiBmbG9vci5nZXRWYWx1ZSgpLmVuZCA+IHN0YXJ0KSByZXR1cm4gZmFsc2U7CgogICAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlcnZhbD4gY2VpbCA9IHBtLmNlaWxpbmdFbnRyeShzdGFydCk7CiAgICAgICAgaWYgKGNlaWwgIT0gbnVsbCAmJiBlbmQgPiBjZWlsLmdldEtleSgpKSByZXR1cm4gZmFsc2U7CgogICAgICAgIEludGVydmFsIGludGVydmFsID0gbmV3IEludGVydmFsKHN0YXJ0LCBlbmQsIHRyYWluLCBwbGF0Zm9ybSk7CiAgICAgICAgcG0ucHV0KHN0YXJ0LCBpbnRlcnZhbCk7CgogICAgICAgIHRyYWluTWFwLnB1dElmQWJzZW50KHRyYWluLCBuZXcgVHJlZU1hcDw+KCkpOwogICAgICAgIHRyYWluTWFwLmdldCh0cmFpbikucHV0KHN0YXJ0LCBpbnRlcnZhbCk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIFBsYXRmb3JtICsgdGltZSAtPiB0cmFpbgogICAgcHVibGljIFN0cmluZyBnZXRUcmFpbkF0UGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtLCBpbnQgdGltZSkgewogICAgICAgIFRyZWVNYXA8SW50ZWdlciwgSW50ZXJ2YWw+IHBtID0gcGxhdGZvcm1NYXAuZ2V0KHBsYXRmb3JtKTsKICAgICAgICBpZiAocG0gPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlcnZhbD4gZSA9IHBtLmZsb29yRW50cnkodGltZSk7CiAgICAgICAgaWYgKGUgPT0gbnVsbCB8fCB0aW1lID49IGUuZ2V0VmFsdWUoKS5lbmQpIHJldHVybiBudWxsOwoKICAgICAgICByZXR1cm4gZS5nZXRWYWx1ZSgpLnRyYWluOwogICAgfQoKICAgIC8vIFRyYWluICsgdGltZSAtPiBwbGF0Zm9ybQogICAgcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybUZvclRyYWluKFN0cmluZyB0cmFpbiwgaW50IHRpbWUpIHsKICAgICAgICBUcmVlTWFwPEludGVnZXIsIEludGVydmFsPiB0bSA9IHRyYWluTWFwLmdldCh0cmFpbik7CiAgICAgICAgaWYgKHRtID09IG51bGwpIHJldHVybiBudWxsOwoKICAgICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZXJ2YWw+IGUgPSB0bS5mbG9vckVudHJ5KHRpbWUpOwogICAgICAgIGlmIChlID09IG51bGwgfHwgdGltZSA+PSBlLmdldFZhbHVlKCkuZW5kKSByZXR1cm4gbnVsbDsKCiAgICAgICAgcmV0dXJuIGUuZ2V0VmFsdWUoKS5wbGF0Zm9ybTsKICAgIH0KfQovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCX0KfQ==