using 2 heap
\ntype Server struct {\n    Id int\n    AvailableAt int\n}\n\ntype BusyPriorityQ []Server\n\nfunc (pq BusyPriorityQ) Len() int {\n    return len(pq)\n}\n\nfunc 
```\ntype Server struct {\n    Id int\n    AvailableAt int\n}\n\ntype BusyPriorityQ []Server\n\nfunc (pq BusyPriorityQ) Len() int {\n    return len(pq)\n}\n\nfunc (pq BusyPriorityQ) Less(i, j int) bool {\n    return pq[i].AvailableAt < pq[j].AvailableAt \n}\n\nfunc (pq BusyPriorityQ) Swap(i, j int) {\n    pq[i], pq[j] = pq[j], pq[i] \n}\n\nfunc (pq *BusyPriorityQ) Push(item interface{}) {\n    *pq = append(*pq, item.(Server)) \n}\n\nfunc (pq *BusyPriorityQ) Pop() interface{} {\n    l := len(*pq)\n    item := (*pq)[l-1]\n    (*pq) = (*pq)[:l-1]\n    return item\n}\n\ntype FreePriorityQ []Server\n\nfunc (pq FreePriorityQ) Len() int {\n    return len(pq)\n}\n\nfunc (pq FreePriorityQ) Less(i, j int) bool {\n    return pq[i].Id < pq[j].Id \n}\n\nfunc (pq FreePriorityQ) Swap(i, j int) {\n    pq[i], pq[j] = pq[j], pq[i] \n}\n\nfunc (pq *FreePriorityQ) Push(item interface{}) {\n    *pq = append(*pq, item.(Server)) \n}\n\nfunc (pq *FreePriorityQ) Pop() interface{} {\n    l := len(*pq)\n    item := (*pq)[l-1]\n    (*pq) = (*pq)[:l-1]\n    return item\n}\n\nfunc busiestServers(k int, arrival []int, load []int) []int {\n    busyPq := &BusyPriorityQ{}\n    freePq := &FreePriorityQ{}\n    \n    heap.Init(freePq)\n    heap.Init(busyPq)\n    \n    for i:=0; i<k;i++ {\n        heap.Push(freePq, Server{\n            Id : i,\n            AvailableAt: 0,\n        })\n    }\n    \n    count := make([]int, k)\n    max := 0\n    \n    for i:=0; i<len(arrival); i++ {\n        startTime := arrival[i]\n        endTime := startTime + load[i]\n        \n        for len(*busyPq) > 0 && (*busyPq)[0].AvailableAt <= startTime{\n            nextFreeServer := heap.Pop(busyPq).(Server)\n            \n            serverId := nextFreeServer.Id\n            \n            modifiedId := serverId - i\n            \n            for modifiedId < 0 {\n                modifiedId = modifiedId + k\n            }\n            \n            modifiedId = modifiedId % k + i\n            //fmt.Println(serverId, modifiedId, i, (serverId - i) % k)\n            nextFreeServer.Id  = modifiedId\n            heap.Push(freePq, nextFreeServer)\n        }\n        \n        if len(*freePq) > 0 {\n            assigning := heap.Pop(freePq).(Server)\n            assigning.AvailableAt = endTime\n            \n            busyId  := assigning.Id % k \n            assigning.Id = busyId\n            \n            heap.Push(busyPq, assigning)\n            \n            count[assigning.Id]++\n            \n            if max < count[assigning.Id] {\n                max = count[assigning.Id]\n            }\n        }\n    }\n    \n    \n    result := []int{}\n    for i:=0; i<k; i++ {\n        if count[i] == max {\n            result = append(result, i)\n        }\n    }\n    \n    return result\n}\n\n```
['Go']