#P16991. [SGU466] Parking at Secret Object

[SGU466] Parking at Secret Object

题目描述

NN 个停车位按顺时针排成一个圆,编号为 1N1\sim N,其中 11NN 相邻。停车位可能为空闲,也可能已被占用。

把一个空闲簇定义为极大的连续空闲停车位集合。簇的大小是其中停车位数量;簇的头是沿顺时针方向进入该簇时遇到的第一个停车位。若所有停车位都空闲,则认为只有一个大小为 NN、头为 11 的簇。

需要依次处理 QQ 个操作:

  • PARK S:有 SS 个用户需要停车。选择大小不小于 SS 的簇中大小最小的一个;若有多个,再选择头编号最小的一个。从该簇的头开始顺时针分配连续 SS 个停车位。若不存在足够大的簇,输出 NO ROOM
  • LEAVE q:第 qq 次操作中成功停车的用户离开,其当时占用的全部停车位重新变为空闲,并与相邻空闲簇合并。

所有 LEAVE 都保证合法,不会引用另一个 LEAVE,也不会让同一组已经离开的用户再次离开。

输入格式

第一行两个整数 N,QN,Q。第二行一个长度为 NN 的字符串,仅由 .X 组成,分别表示空闲和占用。

随后 QQ 行,每行为 PARK SLEAVE q

原题数据规模很大,需要每次操作在对数复杂度内完成;本题包按 N,Q100000N,Q\le100000 的上界覆盖极限测试。PARK1SN1\le S\le NLEAVE1q<i1\le q<i

输出格式

对每个 PARK 输出一行。失败输出 NO ROOM;成功时将分配到的停车位写成若干按编号递增的闭区间,格式与样例一致。单点只写一个编号,跨过 N1N\to1 时会拆成两个区间。

样例

10 4
..........
PARK 4
PARK 3
LEAVE 1
PARK 4
1-4
5-7
1,8-10