#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
class UberShuttle {
private:
struct Interval {
int l, r;
Interval(int left, int right) : l(left), r(right) {}
};
int n;
// l -> r
unordered_map<int, int> startMap;
// r -> l
unordered_map<int, int> endMap;
int getSeat(const Interval& interval) {
int l = interval.l;
int r = interval.r;
if (l == -1)
return 0;
if (r == n)
return n - 1;
return l + (r - l) / 2;
}
int getDistance(const Interval& interval) {
int l = interval.l;
int r = interval.r;
if (l == -1)
return r;
if (r == n)
return n - 1 - l;
return (r - l) / 2;
}
struct Compare {
UberShuttle* shuttle;
Compare(UberShuttle* s = nullptr) {
shuttle = s;
}
bool operator()(const Interval& a,
const Interval& b) const {
int distA = shuttle->getDistance(a);
int distB = shuttle->getDistance(b);
if (distA == distB) {
return shuttle->getSeat(a) >
shuttle->getSeat(b);
}
return distA < distB;
}
};
priority_queue<
Interval,
vector<Interval>,
Compare
> pq;
public:
UberShuttle(int seats)
: n(seats), pq(Compare(this)) {
pq.push(Interval(-1, n));
startMap[-1] = n;
endMap[n] = -1;
}
int board() {
while (!pq.empty()) {
Interval curr = pq.top();
pq.pop();
// Ignore stale intervals
if (!startMap.count(curr.l) ||
startMap[curr.l] != curr.r) {
continue;
}
int seat = getSeat(curr);
startMap.erase(curr.l);
endMap.erase(curr.r);
Interval left(curr.l, seat);
Interval right(seat, curr.r);
pq.push(left);
pq.push(right);
startMap[left.l] = left.r;
endMap[left.r] = left.l;
startMap[right.l] = right.r;
endMap[right.r] = right.l;
return seat;
}
return -1;
}
void dropOff(int p) {
int left = endMap[p];
int right = startMap[p];
startMap.erase(p);
endMap.erase(p);
Interval merged(left, right);
startMap[left] = right;
endMap[right] = left;
pq.push(merged);
}
};
int main() {
UberShuttle shuttle(10);
cout << shuttle.board() << endl; // 0
cout << shuttle.board() << endl; // 9
cout << shuttle.board() << endl; // 4
cout << shuttle.board() << endl; // 2
shuttle.dropOff(4);
cout << shuttle.board() << endl; // 5
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVWJlclNodXR0bGUgewpwcml2YXRlOgogICAgc3RydWN0IEludGVydmFsIHsKICAgICAgICBpbnQgbCwgcjsKCiAgICAgICAgSW50ZXJ2YWwoaW50IGxlZnQsIGludCByaWdodCkgOiBsKGxlZnQpLCByKHJpZ2h0KSB7fQogICAgfTsKCiAgICBpbnQgbjsKCiAgICAvLyBsIC0+IHIKICAgIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IHN0YXJ0TWFwOwoKICAgIC8vIHIgLT4gbAogICAgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gZW5kTWFwOwoKICAgIGludCBnZXRTZWF0KGNvbnN0IEludGVydmFsJiBpbnRlcnZhbCkgewogICAgICAgIGludCBsID0gaW50ZXJ2YWwubDsKICAgICAgICBpbnQgciA9IGludGVydmFsLnI7CgogICAgICAgIGlmIChsID09IC0xKQogICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgaWYgKHIgPT0gbikKICAgICAgICAgICAgcmV0dXJuIG4gLSAxOwoKICAgICAgICByZXR1cm4gbCArIChyIC0gbCkgLyAyOwogICAgfQoKICAgIGludCBnZXREaXN0YW5jZShjb25zdCBJbnRlcnZhbCYgaW50ZXJ2YWwpIHsKICAgICAgICBpbnQgbCA9IGludGVydmFsLmw7CiAgICAgICAgaW50IHIgPSBpbnRlcnZhbC5yOwoKICAgICAgICBpZiAobCA9PSAtMSkKICAgICAgICAgICAgcmV0dXJuIHI7CgogICAgICAgIGlmIChyID09IG4pCiAgICAgICAgICAgIHJldHVybiBuIC0gMSAtIGw7CgogICAgICAgIHJldHVybiAociAtIGwpIC8gMjsKICAgIH0KCiAgICBzdHJ1Y3QgQ29tcGFyZSB7CiAgICAgICAgVWJlclNodXR0bGUqIHNodXR0bGU7CgogICAgICAgIENvbXBhcmUoVWJlclNodXR0bGUqIHMgPSBudWxscHRyKSB7CiAgICAgICAgICAgIHNodXR0bGUgPSBzOwogICAgICAgIH0KCiAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEludGVydmFsJiBhLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcnZhbCYgYikgY29uc3QgewoKICAgICAgICAgICAgaW50IGRpc3RBID0gc2h1dHRsZS0+Z2V0RGlzdGFuY2UoYSk7CiAgICAgICAgICAgIGludCBkaXN0QiA9IHNodXR0bGUtPmdldERpc3RhbmNlKGIpOwoKICAgICAgICAgICAgaWYgKGRpc3RBID09IGRpc3RCKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2h1dHRsZS0+Z2V0U2VhdChhKSA+CiAgICAgICAgICAgICAgICAgICAgICAgc2h1dHRsZS0+Z2V0U2VhdChiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRpc3RBIDwgZGlzdEI7CiAgICAgICAgfQogICAgfTsKCiAgICBwcmlvcml0eV9xdWV1ZTwKICAgICAgICBJbnRlcnZhbCwKICAgICAgICB2ZWN0b3I8SW50ZXJ2YWw+LAogICAgICAgIENvbXBhcmUKICAgID4gcHE7CgpwdWJsaWM6CiAgICBVYmVyU2h1dHRsZShpbnQgc2VhdHMpCiAgICAgICAgOiBuKHNlYXRzKSwgcHEoQ29tcGFyZSh0aGlzKSkgewoKICAgICAgICBwcS5wdXNoKEludGVydmFsKC0xLCBuKSk7CgogICAgICAgIHN0YXJ0TWFwWy0xXSA9IG47CiAgICAgICAgZW5kTWFwW25dID0gLTE7CiAgICB9CgogICAgaW50IGJvYXJkKCkgewoKICAgICAgICB3aGlsZSAoIXBxLmVtcHR5KCkpIHsKCiAgICAgICAgICAgIEludGVydmFsIGN1cnIgPSBwcS50b3AoKTsKICAgICAgICAgICAgcHEucG9wKCk7CgogICAgICAgICAgICAvLyBJZ25vcmUgc3RhbGUgaW50ZXJ2YWxzCiAgICAgICAgICAgIGlmICghc3RhcnRNYXAuY291bnQoY3Vyci5sKSB8fAogICAgICAgICAgICAgICAgc3RhcnRNYXBbY3Vyci5sXSAhPSBjdXJyLnIpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQgc2VhdCA9IGdldFNlYXQoY3Vycik7CgogICAgICAgICAgICBzdGFydE1hcC5lcmFzZShjdXJyLmwpOwogICAgICAgICAgICBlbmRNYXAuZXJhc2UoY3Vyci5yKTsKCiAgICAgICAgICAgIEludGVydmFsIGxlZnQoY3Vyci5sLCBzZWF0KTsKICAgICAgICAgICAgSW50ZXJ2YWwgcmlnaHQoc2VhdCwgY3Vyci5yKTsKCiAgICAgICAgICAgIHBxLnB1c2gobGVmdCk7CiAgICAgICAgICAgIHBxLnB1c2gocmlnaHQpOwoKICAgICAgICAgICAgc3RhcnRNYXBbbGVmdC5sXSA9IGxlZnQucjsKICAgICAgICAgICAgZW5kTWFwW2xlZnQucl0gPSBsZWZ0Lmw7CgogICAgICAgICAgICBzdGFydE1hcFtyaWdodC5sXSA9IHJpZ2h0LnI7CiAgICAgICAgICAgIGVuZE1hcFtyaWdodC5yXSA9IHJpZ2h0Lmw7CgogICAgICAgICAgICByZXR1cm4gc2VhdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICB2b2lkIGRyb3BPZmYoaW50IHApIHsKCiAgICAgICAgaW50IGxlZnQgPSBlbmRNYXBbcF07CiAgICAgICAgaW50IHJpZ2h0ID0gc3RhcnRNYXBbcF07CgogICAgICAgIHN0YXJ0TWFwLmVyYXNlKHApOwogICAgICAgIGVuZE1hcC5lcmFzZShwKTsKCiAgICAgICAgSW50ZXJ2YWwgbWVyZ2VkKGxlZnQsIHJpZ2h0KTsKCiAgICAgICAgc3RhcnRNYXBbbGVmdF0gPSByaWdodDsKICAgICAgICBlbmRNYXBbcmlnaHRdID0gbGVmdDsKCiAgICAgICAgcHEucHVzaChtZXJnZWQpOwogICAgfQp9OwoKaW50IG1haW4oKSB7CgogICAgVWJlclNodXR0bGUgc2h1dHRsZSgxMCk7CgogICAgY291dCA8PCBzaHV0dGxlLmJvYXJkKCkgPDwgZW5kbDsgLy8gMAogICAgY291dCA8PCBzaHV0dGxlLmJvYXJkKCkgPDwgZW5kbDsgLy8gOQogICAgY291dCA8PCBzaHV0dGxlLmJvYXJkKCkgPDwgZW5kbDsgLy8gNAogICAgY291dCA8PCBzaHV0dGxlLmJvYXJkKCkgPDwgZW5kbDsgLy8gMgoKICAgIHNodXR0bGUuZHJvcE9mZig0KTsKCiAgICBjb3V0IDw8IHNodXR0bGUuYm9hcmQoKSA8PCBlbmRsOyAvLyA1CgogICAgcmV0dXJuIDA7Cn0=