#P1543. Memory Manager

Memory Manager

题目描述

第一个国家级操作系统 —— BerlOS 就要发布了。但是,它的一些功能还没有完善,比如内存管理系统。在开发者的计划里,第一版里的内存管理系统是简单并且是线性的。它将会支持以下操作:

  • alloc n —— 在内存中分配 nn 字节的空间。此命令将返回已分配的内存块的编号 xx
  • erase x —— 释放编号为 xx 的内存块。
  • defragment —— 碎片整理,将所有内存块全部向内存的起点靠拢并且不改变它们的顺序。

整条内存一共有 mm 个字节,每个字节依次编号为 1,2,...,m1,2,...,m

操作 alloc\tt alloc 有一个参数 nn,表示需要分配 nn 字节大小的内存块。在执行这个操作时,系统将把一块最靠近内存起点的,长度为 nn 的连续空闲字节分配到一个内存块(这块内存块内的所有字节将被标记为已使用)。这个操作的返回值为这块内存块的编号。如果没有符合条件的内存块,返回 NULL

操作 erase\tt erase 有一个参数 xx,表示需要释放的内存块的编号。它将释放这个内存块(这块内存块内的所有字节将被标记为空闲)。如果成功释放,不返回值;如果编号为 xx 的内存块不存在,返回 ILLEGAL_ERASE_ARGUMENT

操作 deflagment\tt deflagment 没有任何参数。它只是将所有内存块向前依次(编号小的地方)挪动直到它们紧挨在一起,不改变它们的顺序。

你将用连续的正整数(1,2,...1,2,...)作为每一个内存块的编号。比如,第 ii 次分配的内存块编号为 ii。你的任务是依次输出所有 alloc\tt alloc 指令的返回值,以及所有执行失败的 erase\tt erase 指令的返回值。

输入格式

第一行包括两个正整数 ttmmtt 表示操作次数,mm 表示内存大小(为 mm 字节)。

接下来的 tt 行为每一次的命令。

输出格式

依次为每次执行的 alloc\tt alloc 指令的返回值或执行失败的 erase 指令返回的 ILLEGAL_ERASE_ARGUMENT

6 10
alloc 5
alloc 3
erase 1
alloc 6
defragment
alloc 6
1
2
NULL
3