text: # Problem There is little time left before the release of the first national operating system BerlOS.Some of its components are not finished yet — the memory manager is among them.According to the developers' plan, in the first release the memory manager will be very simple and rectilinear.It will support three operations: * alloc n — to allocate n bytes of the memory and return the allocated block's identifier x; * erase x — to erase the block with the identifier x; * defragment — to defragment the free memory, bringing all the blocks as close to the beginning of the memory as possible and preserving their respective order; The memory model in this case is very simple.It is a sequence of m bytes, numbered for convenience from the first to the m-th.The first operation alloc n takes as the only parameter the size of the memory block that is to be allocated.While processing this operation, a free block of n successive bytes is being allocated in the memory.If the amount of such blocks is more than one, the block closest to the beginning of the memory (i.e.to the first byte) is prefered.All these bytes are marked as not free, and the memory manager returns a 32-bit integer numerical token that is the identifier of this block.If it is impossible to allocate a free block of this size, the function returns NULL.The second operation erase x takes as its parameter the identifier of some block.This operation frees the system memory, marking the bytes of this block as free for further use.In the case when this identifier does not point to the previously allocated block, which has not been erased yet, the function returns ILLEGAL_ERASE_ARGUMENT.The last operation defragment does not have any arguments and simply brings the occupied memory sections closer to the beginning of the memory without changing their respective order.In the current implementation you are to use successive integers, starting with 1, as identifiers.