import heapq

def top_k_frequent(nums, k):
    if k <= 0:
        return []
    counts, first = {}, {}
    for i, value in enumerate(nums):
        counts[value] = counts.get(value, 0) + 1
        first.setdefault(value, i)
    heap = []
    for value, count in counts.items():
        heapq.heappush(heap, (count, -first[value], value))
        if len(heap) > k:
            heapq.heappop(heap)
    return [value for count, position, value in sorted(heap, reverse=True)]
