def getStaleSkillCount(numSkills, requestLogs, queryTimes, timeWindow):
from collections import defaultdict
# Sort request logs by timestamp
requestLogs.sort(key=lambda x: x[1])
# Attach index to each query for placing results in correct order
indexed_queries = sorted([(qt, i) for i, qt in enumerate(queryTimes)])
result = [0] * len(queryTimes)
m = len(requestLogs)
left = right
right = left
# Use a dict to track counts of skillIDs seen in the current window
active_skills = defaultdict(int)
for qt, idx in indexed_queries:
start_time = qt - timeWindow
# Expand the right side of the window
while right < m and requestLogs[right][1] <= qt:
skill_id, ts = requestLogs[right]
if ts >= start_time:
active_skills[skill_id] += 1
right += 1
# Shrink the left side of the window
while left < m and requestLogs[left][1] < start_time:
skill_id, ts = requestLogs[left]
if active_skills[skill_id] > 0:
active_skills[skill_id] -= 1
if active_skills[skill_id] == 0:
del active_skills[skill_id]
left += 1
result[idx] = numSkills - len(active_skills)
return result
ZGVmIGdldFN0YWxlU2tpbGxDb3VudChudW1Ta2lsbHMsIHJlcXVlc3RMb2dzLCBxdWVyeVRpbWVzLCB0aW1lV2luZG93KToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CgogICAgIyBTb3J0IHJlcXVlc3QgbG9ncyBieSB0aW1lc3RhbXAKICAgIHJlcXVlc3RMb2dzLnNvcnQoa2V5PWxhbWJkYSB4OiB4WzFdKQoKICAgICMgQXR0YWNoIGluZGV4IHRvIGVhY2ggcXVlcnkgZm9yIHBsYWNpbmcgcmVzdWx0cyBpbiBjb3JyZWN0IG9yZGVyCiAgICBpbmRleGVkX3F1ZXJpZXMgPSBzb3J0ZWQoWyhxdCwgaSkgZm9yIGksIHF0IGluIGVudW1lcmF0ZShxdWVyeVRpbWVzKV0pCiAgICByZXN1bHQgPSBbMF0gKiBsZW4ocXVlcnlUaW1lcykKCiAgICBtID0gbGVuKHJlcXVlc3RMb2dzKQogICAgbGVmdCA9IHJpZ2h0CiAgICByaWdodCA9IGxlZnQKCiAgICAjIFVzZSBhIGRpY3QgdG8gdHJhY2sgY291bnRzIG9mIHNraWxsSURzIHNlZW4gaW4gdGhlIGN1cnJlbnQgd2luZG93CiAgICBhY3RpdmVfc2tpbGxzID0gZGVmYXVsdGRpY3QoaW50KQoKICAgIGZvciBxdCwgaWR4IGluIGluZGV4ZWRfcXVlcmllczoKICAgICAgICBzdGFydF90aW1lID0gcXQgLSB0aW1lV2luZG93CgogICAgICAgICMgRXhwYW5kIHRoZSByaWdodCBzaWRlIG9mIHRoZSB3aW5kb3cKICAgICAgICB3aGlsZSByaWdodCA8IG0gYW5kIHJlcXVlc3RMb2dzW3JpZ2h0XVsxXSA8PSBxdDoKICAgICAgICAgICAgc2tpbGxfaWQsIHRzID0gcmVxdWVzdExvZ3NbcmlnaHRdCiAgICAgICAgICAgIGlmIHRzID49IHN0YXJ0X3RpbWU6CiAgICAgICAgICAgICAgICBhY3RpdmVfc2tpbGxzW3NraWxsX2lkXSArPSAxCiAgICAgICAgICAgIHJpZ2h0ICs9IDEKCiAgICAgICAgIyBTaHJpbmsgdGhlIGxlZnQgc2lkZSBvZiB0aGUgd2luZG93CiAgICAgICAgd2hpbGUgbGVmdCA8IG0gYW5kIHJlcXVlc3RMb2dzW2xlZnRdWzFdIDwgc3RhcnRfdGltZToKICAgICAgICAgICAgc2tpbGxfaWQsIHRzID0gcmVxdWVzdExvZ3NbbGVmdF0KICAgICAgICAgICAgaWYgYWN0aXZlX3NraWxsc1tza2lsbF9pZF0gPiAwOgogICAgICAgICAgICAgICAgYWN0aXZlX3NraWxsc1tza2lsbF9pZF0gLT0gMQogICAgICAgICAgICAgICAgaWYgYWN0aXZlX3NraWxsc1tza2lsbF9pZF0gPT0gMDoKICAgICAgICAgICAgICAgICAgICBkZWwgYWN0aXZlX3NraWxsc1tza2lsbF9pZF0KICAgICAgICAgICAgbGVmdCArPSAxCgogICAgICAgIHJlc3VsdFtpZHhdID0gbnVtU2tpbGxzIC0gbGVuKGFjdGl2ZV9za2lsbHMpCgogICAgcmV0dXJuIHJlc3VsdAo=