#P815. 内存管理

内存管理

题目描述:

计算机的内存管理是一件很麻烦的事情,我们研究一个高度简化了的模型。

一共有可用的连续的N Kb内存和M个正在运行的程序。程序运行时会申请若干Kb的内存,系统必须分配相应大小的一块连续的内存给这个程序,或者返回内存不足的错误。

系统分配内存的方式是:从内存的头部开始查找,直至找到第一块满足要求的可用内存,就把这些内存单元分配给申请内存的程序,并把这些内存标记为不可用,如果找不到一块满足要求的可用内存,就返回内存不足的错误。当某个程序退出时,所有它曾经申请的内存都变成可用的。

你的任务是模拟内存分配的全过程,并输出每次内存分配的结果。

输入格式:

第一行有三个整数:N、M、P,表示有N Kb的可用内存(以1..N编号)和M个正在运行的程序(以1..M编号)和P条命令。

以下P行,每行有两个整数A、B,表示某个程序要申请内存或者退出。A表示程序的编号,若B不等于0,则B表示程序A要申请的内存的大小(以Kb为单位);否则表示该程序要退出,可以将它曾经申请的所有内存标记为可用。

输出格式:

需要输出P行,每行一个数,对应输入数据中的P个命令的结果。

若对应的命令表示程序申请内存,则输出申请到的连续内存的起始位置的编号,如果不能满足申请内存的要求,输出-1,表示内存不足。

若对应的命令表示程序退出,则输出被标记为可用的内存的总数。

输入样例:

10 3 10(共有10Kb的可用内存,共有3个程序正在运行,以下共有10条命令)
1 2(程序1申请2Kb的内存)
2 2(程序2申请2Kb的内存)
3 3(程序3申请3Kb的内存)
2 2(程序2申请2Kb的内存)
2 0(程序2退出)
1 4(程序1申请4Kb的内存)
3 1(程序3申请3Kb的内存)
1 3(程序1申请3Kb的内存)
1 0(程序1退出)
3 0(程序3退出)

(括号中的语言为对输入样例的解释,并不在实际的输入文件中)

输出样例:

1(程序1申请的2Kb的内存的起始位置是1,编号为1、2的内存被程序1占用)
3(程序2申请的2Kb的内存的起始位置是3,编号为3、4的内存被程序2占用)
5(程序3申请的3Kb的内存的起始位置是5,编号为5、6、7的内存被程序3占用)
8(程序2申请的2Kb的内存的起始位置是8,编号为8、9的内存被程序2占用)
4(程序2退出后,编号为3、4、8、9的4Kb内存变得可用)
-1(目前可用的内存有3、4、8、9、10,不存在大小为4的连续可用内存,故输出-1)
3(程序3申请的1Kb的内存的起始位置是3,编号为3的内存被程序3占用)
8(程序1申请的3Kb的内存的起始位置是8,编号为8、9、10的内存被程序1占用)
5(程序1退出后,编号为1、2、8、9、10的5Kb内存变得可用)
4(程序3退出后,编号为3、5、6、7的4Kb内存变得可用)

(括号中的语言为对输出样例的解释,并不在实际的输出文件中)

数据范围:

N<=5000,M<=100,P<=2000