class Solution {
private var tree: [ Int] = [ ]
// Building the segment tree
private func buildTree( _ start: Int, _ end: Int, _ p: Int) -> Int {
if start == end {
tree[ p] = 1
return tree[ p]
}
let mid = ( start + end) / 2
tree[ p] = buildTree( start, mid, 2 * p + 1 ) + buildTree( mid + 1 , end, 2 * p + 2 )
return tree[ p]
}
// Comparator function for sorting
private static func cmp( _ a: [ Int] , _ b: [ Int] ) -> Bool {
if a[ 0 ] == b[ 0 ] {
return a[ 1 ] > b[ 1 ]
}
return a[ 0 ] < b[ 0 ]
}
// Function to get the index using the segment tree
private func getIndex( _ start: Int, _ end: Int, _ value: inout Int, _ p: Int, _ index: inout Int) {
if start > end { return }
if start == end {
tree[ p] -= 1
index = start
return
}
let mid = ( start + end) / 2
if tree[ 2 * p + 1 ] > value {
tree[ p] -= 1
getIndex( start, mid, & value, 2 * p + 1 , & index)
} else {
tree[ p] -= 1
value -= tree[ 2 * p + 1 ]
getIndex( mid + 1 , end, & value, 2 * p + 2 , & index)
}
}
// Reconstruct the queue using the segment tree
func reconstructQueue( _ people: [ [ Int] ] ) -> [ [ Int] ] {
var people = people
people.sort ( by: Solution.cmp )
let n = people.count
var size = 1
while size < n {
size *= 2
}
let arrSize = size - 1
size *= 2
tree = Array( repeating: 0 , count: size)
buildTree( 0 , n - 1 , 0 )
var res = Array( repeating: [ Int] ( ) , count: n)
for person in people {
var index = 0
var k = person[ 1 ]
getIndex( 0 , n - 1 , & k, 0 , & index)
res[ index] .append ( person[ 0 ] )
res[ index] .append ( person[ 1 ] )
}
return res
}
}
Y2xhc3MgU29sdXRpb24gewogICAgcHJpdmF0ZSB2YXIgdHJlZTogW0ludF0gPSBbXQoKICAgIC8vIEJ1aWxkaW5nIHRoZSBzZWdtZW50IHRyZWUKICAgIHByaXZhdGUgZnVuYyBidWlsZFRyZWUoXyBzdGFydDogSW50LCBfIGVuZDogSW50LCBfIHA6IEludCkgLT4gSW50IHsKICAgICAgICBpZiBzdGFydCA9PSBlbmQgewogICAgICAgICAgICB0cmVlW3BdID0gMQogICAgICAgICAgICByZXR1cm4gdHJlZVtwXQogICAgICAgIH0KICAgICAgICBsZXQgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDIKICAgICAgICB0cmVlW3BdID0gYnVpbGRUcmVlKHN0YXJ0LCBtaWQsIDIgKiBwICsgMSkgKyBidWlsZFRyZWUobWlkICsgMSwgZW5kLCAyICogcCArIDIpCiAgICAgICAgcmV0dXJuIHRyZWVbcF0KICAgIH0KCiAgICAvLyBDb21wYXJhdG9yIGZ1bmN0aW9uIGZvciBzb3J0aW5nCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jIGNtcChfIGE6IFtJbnRdLCBfIGI6IFtJbnRdKSAtPiBCb29sIHsKICAgICAgICBpZiBhWzBdID09IGJbMF0gewogICAgICAgICAgICByZXR1cm4gYVsxXSA+IGJbMV0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFbMF0gPCBiWzBdCiAgICB9CgogICAgLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBpbmRleCB1c2luZyB0aGUgc2VnbWVudCB0cmVlCiAgICBwcml2YXRlIGZ1bmMgZ2V0SW5kZXgoXyBzdGFydDogSW50LCBfIGVuZDogSW50LCBfIHZhbHVlOiBpbm91dCBJbnQsIF8gcDogSW50LCBfIGluZGV4OiBpbm91dCBJbnQpIHsKICAgICAgICBpZiBzdGFydCA+IGVuZCB7IHJldHVybiB9CiAgICAgICAgaWYgc3RhcnQgPT0gZW5kIHsKICAgICAgICAgICAgdHJlZVtwXSAtPSAxCiAgICAgICAgICAgIGluZGV4ID0gc3RhcnQKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBsZXQgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDIKICAgICAgICBpZiB0cmVlWzIgKiBwICsgMV0gPiB2YWx1ZSB7CiAgICAgICAgICAgIHRyZWVbcF0gLT0gMQogICAgICAgICAgICBnZXRJbmRleChzdGFydCwgbWlkLCAmdmFsdWUsIDIgKiBwICsgMSwgJmluZGV4KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRyZWVbcF0gLT0gMQogICAgICAgICAgICB2YWx1ZSAtPSB0cmVlWzIgKiBwICsgMV0KICAgICAgICAgICAgZ2V0SW5kZXgobWlkICsgMSwgZW5kLCAmdmFsdWUsIDIgKiBwICsgMiwgJmluZGV4KQogICAgICAgIH0KICAgIH0KCiAgICAvLyBSZWNvbnN0cnVjdCB0aGUgcXVldWUgdXNpbmcgdGhlIHNlZ21lbnQgdHJlZQogICAgZnVuYyByZWNvbnN0cnVjdFF1ZXVlKF8gcGVvcGxlOiBbW0ludF1dKSAtPiBbW0ludF1dIHsKICAgICAgICB2YXIgcGVvcGxlID0gcGVvcGxlCiAgICAgICAgcGVvcGxlLnNvcnQoYnk6IFNvbHV0aW9uLmNtcCkKCiAgICAgICAgbGV0IG4gPSBwZW9wbGUuY291bnQKICAgICAgICB2YXIgc2l6ZSA9IDEKICAgICAgICB3aGlsZSBzaXplIDwgbiB7CiAgICAgICAgICAgIHNpemUgKj0gMgogICAgICAgIH0KICAgICAgICBsZXQgYXJyU2l6ZSA9IHNpemUgLSAxCiAgICAgICAgc2l6ZSAqPSAyCiAgICAgICAgdHJlZSA9IEFycmF5KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUpCgogICAgICAgIGJ1aWxkVHJlZSgwLCBuIC0gMSwgMCkKICAgICAgICB2YXIgcmVzID0gQXJyYXkocmVwZWF0aW5nOiBbSW50XSgpLCBjb3VudDogbikKCiAgICAgICAgZm9yIHBlcnNvbiBpbiBwZW9wbGUgewogICAgICAgICAgICB2YXIgaW5kZXggPSAwCiAgICAgICAgICAgIHZhciBrID0gcGVyc29uWzFdCiAgICAgICAgICAgIGdldEluZGV4KDAsIG4gLSAxLCAmaywgMCwgJmluZGV4KQogICAgICAgICAgICByZXNbaW5kZXhdLmFwcGVuZChwZXJzb25bMF0pCiAgICAgICAgICAgIHJlc1tpbmRleF0uYXBwZW5kKHBlcnNvblsxXSkKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXMKICAgIH0KfQ==
stdin
Ly8gRXhhbXBsZSB1c2FnZQpsZXQgc29sdXRpb24gPSBTb2x1dGlvbigpCmxldCBwZW9wbGUgPSBbWzcsIDBdLCBbNCwgNF0sIFs3LCAxXSwgWzUsIDBdLCBbNiwgMV0sIFs1LCAyXV0KbGV0IHJlc3VsdCA9IHNvbHV0aW9uLnJlY29uc3RydWN0UXVldWUocGVvcGxlKQpwcmludChyZXN1bHQp
// Example usage
let solution = Solution()
let people = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]
let result = solution.reconstructQueue(people)
print(result)