What are pointers, dynamic allocation, and memory leaks?
Implement a function that models dynamic memory ownership by processing allocation and release events. Return the identifiers of blocks that remain allocated, preserving their allocation order.
events is a list of ['alloc', id] or ['free', id] pairs. Return a list of allocated identifiers that were never freed.
def find_memory_leaks(events):