| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | func getSkyline(buildings [][]int) [][]int {	ans := [][]int{{-1, -1}} // Prevent out of index error	var sl SortedList	pq := NewPQ()	length := len(buildings)	for i, top := 0, 0; i < length || !pq.Empty(); {		if i == length || (!pq.Empty() && pq.Peek().(Pair)._1 <= buildings[i][0]) { // Delete			p := pq.Dequeue().(Pair)			sl.Delete(p._2)			if p._1 == ans[top][0] {				ans[top][1] = sl.Max()			} else {				ans = append(ans, []int{p._1, sl.Max()})				top++			}		} else { // Insert			l, r, h := buildings[i][0], buildings[i][1], buildings[i][2]			sl.Insert(h)			pq.Enqueue(Pair{r, h})			i++			if l == ans[top][0] {				ans[top][1] = sl.Max()			} else {				ans = append(ans, []int{l, sl.Max()})				top++			}		}		if ans[top][1] == ans[top-1][1] { // If the height is same, pop the top of ans			ans = ans[:top]			top--		}	}	return ans[1:]}type SortedList struct {	List []int	Len  int}func (sl SortedList) Max() int {	if sl.Len == 0 {		return 0	}	return sl.List[sl.Len-1]}func (sl SortedList) Search(x int) int {	beg, end := 0, sl.Len	for beg < end {		mid := beg + (end-beg)/2		if x < sl.List[mid] {			end = mid		} else if sl.List[mid] < x {			beg = mid + 1		} else {			return mid		}	}	return beg}func (sl *SortedList) Insert(x int) {	idx := sl.Search(x)	sl.List = append(sl.List, 0)	copy(sl.List[idx+1:], sl.List[idx:])	sl.List[idx] = x	sl.Len++}func (sl *SortedList) Delete(x int) {	idx := sl.Search(x)	copy(sl.List[idx:], sl.List[idx+1:])	sl.List = sl.List[:sl.Len-1]	sl.Len--}type Pair struct {	_1 int	_2 int}func (p Pair) Less(q Item) bool { return p._1 < q.(Pair)._1 }type PQ struct {	Queue []Item	Len   int}type Item interface {	Less(than Item) bool}func NewPQ() (pq PQ) {	pq.Queue = make([]Item, 1)	return}func (pq PQ) Less(i, j int) bool { return pq.Queue[i].Less(pq.Queue[j]) }func (pq PQ) Swap(i, j int)      { pq.Queue[i], pq.Queue[j] = pq.Queue[j], pq.Queue[i] }func (pq PQ) Empty() bool { return pq.Len == 0 }func (pq PQ) Peek() Item { return pq.Queue[1] }func (pq *PQ) Enqueue(item Item) {	pq.Queue = append(pq.Queue, item)	pq.Len++	pq.swim(pq.Len)}func (pq *PQ) Dequeue() Item {	pq.Swap(1, pq.Len)	item := pq.Queue[pq.Len]	pq.Queue = pq.Queue[:pq.Len]	pq.Len--	pq.sink(1)	return item}func (pq PQ) swim(i int) {	for 1 < i && pq.Queue[i].Less(pq.Queue[i/2]) {		pq.Swap(i, i/2)		i /= 2	}}func (pq PQ) sink(i int) {	for j := 2 * i; j <= pq.Len; j *= 2 {		if j+1 <= pq.Len && pq.Queue[j+1].Less(pq.Queue[j]) {			j++		}		if !pq.Queue[j].Less(pq.Queue[i]) {			break		}		pq.Swap(i, j)		i = j	}}
 |