Problem:


Problem A: Sleeping Cats 

Jackは彼の住む家をとても気に入っていた. 彼の家の塀の上で毎日のように愛くるしいねこたちが昼寝をしているからだ. Jackはねこがとても好きだった.

Jackは, 夏休みの自由研究としてねこたちの観察日記を付けることにした. しばらく観察しているうちに, 彼はねこたちの面白い特徴に気付いた.

塀は W[尺] の幅があり, ここにねこたちは並んで昼寝をする. それぞれのねこたちは体の大きさが違うので, 昼寝に必要とする幅もまた異なる. 昼寝をしにきたねこは, 自分が寝られる場所があれば, そこで昼寝をする. ただし, そのような場所が複数ある場合はより左側で昼寝をし, 十分な幅が無ければ諦めて帰ってしまう. しばらく昼寝をしたねこは、起きると塀から飛び降りてどこかへと行ってしまう.

Jackはねこたちを観察して, その行動をノートに書き留めた. しかし, とても多くのねこが昼寝をしていたので, この記録を集計するのはとても大変である. プログラムを書いて, ねこたちが昼寝をした場所を求めるのを手伝ってほしい.

Input

入力ファイルは, 複数のデータセットを含む. それぞれのデータセットの最初の行は2つの整数を含み, それぞれ塀の幅 W と, 後に続く行数 Q を表す.

以下のQ行に, ねこの観察記録が与えられる. 各行は, 以下のいずれかの書式に従う.

s [id] [w]

w [id]

前者は, ねこの sleep 記録であり, ねこが昼寝をしに来たことを表す. id はねこの名前を表す整数であり, w はそのねこが昼寝に必要とする幅 [尺]である.

後者は, ねこの wakeup 記録であり, 名前がidであるねこが起きたことを表す.

この記録は, 時系列順に与えられる.

どのねこも2回以上昼寝をすることはない.
また, Jackの記録に矛盾は無いものとする. つまり, あるねこの sleep 記録に対して, そのねこが昼寝することが出来た場合, またその場合に限って, そのねこの wakeup 記録が(より後の行に)与えられる.

W, Q ≤ 100 と仮定してよい.

W と Q がともに 0 のとき、入力の終わりを示す. このデータセットに対する出力を行ってはならない.

Output

入力のsleep記録が与えられるたびに, 1行出力せよ.
この行は, もしそのねこが昼寝できた場合, その位置を表す数字を含まなければならない. ねこが塀の左端を起点として b [尺] から b+w [尺] の場所で昼寝したならば, b を出力せよ.
そのねこが昼寝できなかった場合, "impossible" と出力せよ.

データセットの終わりに, "END"と出力せよ.

Sample Input

4 6
s 0 2
s 1 3
s 2 1
w 0
s 3 3
s 4 2
3 3
s 0 1
s 1 1
s 2 1
0 0

Output for the Sample Input

0
impossible
2
impossible
0
END
0
1
2
END



Sample input:
4 6
s 0 2
s 1 3
s 2 1
w 0
s 3 3
s 4 2
3 3
s 0 1
s 1 1
s 2 1
0 0


Sample output:
0
impossible
2
impossible
0
END
0
1
2
END

Submission status: Accepted

Solution code:
class Cat:
    def __init__(self, input):
        self.id = int(input[1])
        self.size = int(input[2])

    def sleep(self, index):
        self.index = index

    def last(self):
        return self.index + self.size


def lastindex(list, val):
    result = len(list) - 1
    for n in range(len(list)):
        if list[n] == val:
            result = n
    return result

def indexSleepable(wall, size):
    index = 0
    while index < len(wall):
        target = wall[index:index+size]
        if target == [False] * size:
            return index
        else:
            next_index = lastindex(target, True)
            index += next_index + 1
    else:
        return -1

while True:
    W, Q = [int(n) for n in input().split() ]

    if W == Q == 0:
        break

    lines = [input().strip().split() for n in range(Q) ]

    wall = [False] * W

    Catdict = {}

    for l in lines:
        if l[0] == "s":
            cat = Cat(l)
            index = indexSleepable(wall, cat.size)
            if index != -1:
                cat.sleep(index)
                print(index)
                wall[cat.index:cat.last()] = [True] * cat.size
                Catdict[cat.id] = cat
            else:
                print("impossible")
        elif l[0] == "w":
            cat = Catdict[int(l[1])]
            wall[cat.index:cat.last()] = [False] * cat.size

    print("END")

Submission status: Accepted

Solution code:
while(1):
    [W,Q]=map(int,raw_input().split())
    if W==0 and Q==0: break
    se=[(0,0),(W,W)]
    idq=[10000,100001]
    for i in range(Q):
        S=raw_input().split()
        Sn=[int(x) for x in S[1:]]
        if S[0]=='s':
            for i in range(len(se)-1):
                if se[i+1][0]-se[i][1]>=Sn[1]:
                    print se[i][1]
                    se.insert(i+1,(se[i][1],se[i][1]+Sn[1]))
                    idq.insert(i+1,Sn[0])
                    break
            else:
                print 'impossible'
        if S[0]=='w':
            i=idq.index(Sn[0])
            del se[i]
            del idq[i]
    print 'END'

Submission status: Accepted

Solution code:
while 1:
	W,Q = map(int,raw_input().split())
	if W == 0: break
	cat = [map(str,raw_input().split()) for i in range(Q)]
	wall = [-1]*W
	for i in range(Q):
		if cat[i][0] == "s":
			id,w = int(cat[i][1]),int(cat[i][2])
			for j in range(W-w+1):
				if wall[j:j+w] == [-1]*w:
					wall[j:j+w] = [id]*w
					print j
					break
			else:
				print "impossible"
		else:
			flag = 0
			for j in range(W):
				if wall[j] == int(cat[i][1]):
					wall[j] = -1
					flag = 1
				elif flag == 1:
					break
	print "END"

Submission status: Accepted

Solution code:
while 1:
	W,Q = map(int,raw_input().split())
	if W == 0: break
	cat = [map(str,raw_input().split()) for i in range(Q)]
	dic = {cat[i][1]:[int(cat[i][2]),0] for i in range(Q) if cat[i][0] == "s"}
	wall = [-1]*W
	for i in range(Q):
		if cat[i][0] == "s":
			id,w = cat[i][1],int(cat[i][2])
			for j in range(W-w+1):
				if wall[j:j+w] == [-1]*w:
					wall[j:j+w] = [id]*w
					dic[id][1] = j
					print j
					break
			else:
				print "impossible"
		else:
			w,sp = dic[cat[i][1]]
			wall[sp:sp+w] = [-1]*w
	print "END"

Submission status: Accepted

Solution code:
while 1:
    W, Q = map(int, input().split())
    if W == Q == 0:
        break
    A = [0]*W
    for i in range(Q):
        s, *qs = input().split()
        if s == 's':
            x, w = map(int, qs)
            su = sum(A[:w-1])
            k = -1
            for i in range(W-w+1):
                su += A[i+w-1]
                if su == 0:
                    k = i
                    break
                su -= A[i]
            if k == -1:
                print("impossible")
            else:
                print(k)
                for i in range(w):
                    A[k+i] = x+1
        else:
            x = int(qs[0])
            for i in range(W):
                if A[i] == x+1:
                    A[i] = 0
    print("END")

Submission status: Accepted

Solution code:
while True:
  w, q = map(int, input().split())
  if w == 0 and q == 0:
    break
  wall = [None] * w
  for _ in range(q):
    inp = input().split()
    if inp[0] == "s":
      ind, wid = int(inp[1]), int(inp[2])
      for i in range(w - wid + 1):
        if all(x == None for x in wall[i:i + wid]):
          print(i)
          for j in range(i, i + wid):
            wall[j] = ind
          break
      else:
        print("impossible")
    else:
      ind = int(inp[1])
      for i in range(w):
        if wall[i] == ind:
          wall[i] = None
  print("END")