Problem:


テトリス

テトリスは、落ちてくるブロックを盤面上に並べて消すゲームです。ここでは、それを少しアレンジしたゲームを考えましょう。

このゲームの盤面の大きさは横 5 コマで、出現するブロックがすべて入るだけの高さがあります。落ちてくるブロックは直線状で、横向き、縦向きの 2 種類があり、長さは 1 から 5 までの 5 種類です。

以下に例を示します。Step(イ) からStep(ホ)までの図はブロックが落ちて消えていく様子を表したものです。
Step(イ)から順にStep(ロ)、Step(ハ)と順に進んでいきます。

  ブロックを落とすときに、Step(イ)のようにブロックのどこかが下に積んであるブロックに引っかかったときには、Step(ロ)のように落ちたブロックはその場所で止まります。また、ブロックを落とした結果、盤面の横一行の全てのコマにブロックが詰まった場合には、Step(ニ)で示されるように、その行のブロックが消えます。この後、消えた行の上にあるブロックが、そのままの形で1行下にしずみます(Step(ホ))。

1 ゲームは 1000 個以内のブロックが順に落ちてくることとします。例えば、落ちるブロックの長さが順番に横向き 4 コマ, 横向き 3 コマ, 縦向き 2 コマ, 縦向き 3 コマで、落ちる場所が左端から 1 コマ目、1 コマ目、4 コマ目、5 コマ目であった場合には、下図のStep(イ)~(ト)のように落ち、最後に残るブロックは 2 コマになります。

 順番に落ちてくるブロックの情報を入力とし、全てのブロックが落ちた時に残るコマ数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。各データセットは以下の形式で与えられます。

n
d1 p1 q1
d2 p2 q2
:
dn pn qn

１行目にブロックの数 n (1 ≤ n ≤ 1000) が与えられます。続く n 行に i 個目のブロックの向き di (1 または2)、ブロックの長さ pi (1 ≤ pi ≤ 5)、ブロックの位置 qi が与えられます。ブロックの向き di は 1 が横向きを、2 が縦向きを表します。ブロックの位置 qi は盤面上の左端から1 ~ 5 までの整数とし、横向きのブロックの場合は左端のコマの落ちる位置とします。

データセットの数は 20 を超えません。

Output

データセット毎に最後に残るブロックの占めるコマ数を１行に出力します。

Sample Input

4
1 4 1
1 3 1
2 2 4
2 3 5
1
1 5 1
7
2 2 2
1 4 1
2 1 3
1 4 1
1 1 1
2 5 5
1 4 2
0

Output for the Sample Input

2
0
6



Sample input:
4
1 4 1
1 3 1
2 2 4
2 3 5
1
1 5 1
7
2 2 2
1 4 1
2 1 3
1 4 1
1 1 1
2 5 5
1 4 2
0


Sample output:
2
0
6

Submission status: Accepted

Solution code:
while True:
    N = int(input())
    if N == 0:
        break

    table = [[0 for i in range(5)] for j in range(6000)]
    blocks = [0 for i in range(5)]
    for l in range(N):
        d,p,q = [int(i) for i in input().split()]
        q -= 1
        if d == 1:
            maxtop = 0
            for i in range(q, q+p):
                cnt = 0
                t = 0
                if blocks[i] > 0:
                    for j in range(5000):
                        cnt += table[j][i]
                        if cnt == blocks[i]:
                            t = j+1
                            break

                maxtop = max(maxtop, t)
            for i in range(q, q+p):
                table[maxtop][i] = 1
                blocks[i] += 1
            if table[maxtop][0]*table[maxtop][1]*table[maxtop][2]*table[maxtop][3]*table[maxtop][4] == 1:
                del table[maxtop]
                for i in range(5):
                    blocks[i] -= 1

        else:
            maxtop = 0
            cnt = 0
            if blocks[q] > 0:
                t = 0
                for i in range(5000):
                    cnt += table[i][q]
                    if cnt == blocks[q]:
                        t = i + 1
                        break
                maxtop = t

            for i in range(p):
                table[maxtop + i][q] = 1
            blocks[q] += p

            for i in range(p-1, -1, -1):
                k = maxtop + i
                if table[k][0]*table[k][1]*table[k][2]*table[k][3]*table[k][4] == 1:
                    del table[k]
                    for j in range(5):
                        blocks[j] -= 1

    ans = 0
#    for i in range(9,-1,-1):
#        for j in range(5):
#            print(table[i][j], end = "")
#        print("")

    for i in range(5000):
        for j in range(5):
            ans += table[i][j]

    print(ans)

Submission status: Output Limit Exceeded

Solution code:
def yoko():
    for h, line in enumerate(L):
        if line[q-1:q-1+p] != [' ']*p:
            h = h-1
            break
    for i in range(q-1, q-1+p):
        L[h][i] = '#'
    check(h, 1)
    
def tate():
    for h, line in enumerate(L):
        if line[q-1] != ' ':
            h = h-1
            break
    for i in range(h-p+1, h-p+1+p):
        L[i][q-1] = '#'
    check(h-p+1, p)

def check(h, c):
    while 0 < c:
        if L[h] == ['#']*5:
            del L[h]
        else:
            h += 1
        c -= 1
     
def add():
    c = 0
    for line in L:
        if line == [' ']*5:
            c += 1
        else:
            break
    for i in range(5-c):
        L.insert(0, [' ']*5)
        
def result():
    ans = 0
    for line in L:
        for v in line:
            if v == '#':
                ans += 1
    else:
        print ans

while True:
    n = input()
    if n == 0: break
    L = [[' ']*5 for i in range(5)]
    for line in L:
        print line
    for i in range(n):
        d, p, q = map(int, raw_input().split())
        if d == 1:
            yoko()
        else:
            tate()
        add()
        for line in L:
            print line
    else:
        result()

Submission status: Runtime Error

Solution code:
end = [1,1,1,1,1]
while True:
  n = int(input())
  if n == 0:
    break
  mp = [[0] * 5 for _ in range(4000)]
  height = [0] * 5
  cnt = 0
  for i in range(n):
    d, p, q = map(int, input().split())
    q -= 1
    cnt += p
    if d == 1:
      pos = max(height[q:q + p])
      mp[pos][q:q + p] = [1] * p
      if mp[pos] == end:
        cnt -= 5
        mp.pop(pos)
        mp.append([0] * 5)
        for x in range(5):
          for y in range(i * 5 - 1, -1, -1):
            if mp[y][x] == 1:
              height[x] = y + 1
              break
          else:
            height[x] = 0
      else:
        height[q:q + p] = [pos + 1] * p

    if d == 2:
      pop_flag = False
      pos = height[q]
      for y in range(pos, pos + p):
        mp[y][q] = 1
      for y in range(pos + p - 1, pos - 1, -1):
        if mp[y] == end:
          cnt -= 5
          mp.pop(y)
          mp.append([0] * 5)
          pop_flag = True
      
      if pop_flag:
        for x in range(5):
          for y in range(i * 5 - 1, -1, -1):
            if mp[y][x] == 1:
              height[x] = y + 1
              break
          else:
            height[x] = 0
      else:
        height[q] += p
  
  print(cnt)

Submission status: Runtime Error

Solution code:
N = raw_input()

while True:
    ls = [[None] * 5] * 5000
    flwr = 0
    for _ in xrange(N):
        d, l, pos = raw_input.split()

        # block
        if d == 1:
            for i in xrange(l):
                ls[flwr][pos].append(1)
        else:
            tmp = 0
            for i in xrange(l):
                ls[flwr][pos+tmp].append(1)
                tmp += 1

        # up flower
        if not None in ls[0]:
            flwr += 1
    N = raw_input()

    # end condition
    if not N:
        break

Submission status: Runtime Error

Solution code:
N = input()

while True:
    ls = [[None] * 5] * 5000
    flwr = 0
    for _ in xrange(N):
        d, l, pos = raw_input.split()

        # block
        if d == 1:
            for i in xrange(l):
                ls[flwr][pos].append(1)
        else:
            tmp = 0
            for i in xrange(l):
                ls[flwr][pos+tmp].append(1)
                tmp += 1

        # up flower
        if not None in ls[0]:
            flwr += 1
    N = input()

    # end condition
    if not N:
        break

Submission status: Runtime Error

Solution code:
N = input()

while True:
    ls = [[None] * 5] * 5000
    flwr = 0
    for _ in xrange(N):
        d, l, pos = raw_input.split()
        # block
        if d == 1:
            for i in xrange(l):
                ls[flwr][pos].append(1)
        else:
            tmp = 0
            for i in xrange(l):
                ls[flwr][pos+tmp].append(1)
                tmp += 1
        # up flower
        if not None in ls[0]:
            flwr += 1
    ret = 0
    for i in xrange(flwr):
        ret += len([i for i in ls[i] if not None])

    N = input()
    # end condition
    if not N:
        break

Submission status: Runtime Error

Solution code:
N = int(input())

while True:
    ls = [[None] * 5] * 5000
    flwr = 0
    for _ in xrange(N):
        d, l, pos = map(int, raw_input().split())
        # block
        if d == 1:
            for i in xrange(l):
                ls[flwr][pos].append(1)
        else:
            tmp = 0
            for i in xrange(l):
                ls[flwr][pos+tmp].append(1)
                tmp += 1
        # up flower
        if not None in ls[0]:
            flwr += 1
    ret = 0
    for i in xrange(flwr):
        ret += len([i for i in ls[i] if not None])

    N = int(input())
    # end condition
    if not N:
        break

Submission status: Runtime Error

Solution code:
#!/usr/local/bin/python

N = int(input())

while True:
    ls = [[None] * 5] * 5000
    flwr = 0
    for _ in xrange(N):
        d, l, pos = map(int, raw_input().split())
        # block
        if d == 1:
            for i in xrange(l):
                ls[flwr][pos].append(1)
        else:
            tmp = 0
            for i in xrange(l):
                ls[flwr][pos+tmp].append(1)
                tmp += 1
        # up flower
        if not None in ls[0]:
            flwr += 1
    ret = 0
    for i in xrange(flwr):
        ret += len([i for i in ls[i] if not None])

    print ret

    N = int(input())
    # end condition
    if not N:
        break

Submission status: Runtime Error

Solution code:
#!/usr/local/bin/python


def init():
    return [[None] * 5] * 5000


while True:
    N = int(input())
    if N == 0:
        break
    d, l, pos = [int(n) for n in raw_input().split()]
    lst = init()
    flwr = 0
    pos -= 1
    for _ in xrange(N):
        if d == 1:
            for i in xrange(l):
                lst[flwr][pos + i] = 1
        else:
            tmp = 0
            for i in xrange(l):
                lst[flwr + tmp][pos] = 1
                tmp += 1
        if not None in lst[flwr]:
            flwr += 1
    print flwr
    ret = 0
    for i in xrange(flwr):
        ret += len([i for i in lst[i] if not None])
    print ret

Submission status: Runtime Error

Solution code:
#!/usr/local/bin/python
from itertools import islice

def init():
    return [[None] * 5] * 5000

N = 4

while True:
    #N = int(input())
    if N == 0:
        break
    d, l, pos = [int(n) for n in raw_input().split()]
    lst = init()
    flwr = 0
    for i in xrange(N):
        print d, l, pos
        # if d == 1:
        #     for i in xrange(l):
        #         lst[flwr][pos-1 + i] = 1
        # else:
        #     tmp = 0
        #     for i in xrange(l):
        #         lst[flwr + tmp][pos-1] = 1
        #         tmp += 1
        #print lst[flwr]
        #print not None in lst[flwr]
        if not None in lst[flwr]:
            flwr += 1
    ret = 0
    for i in xrange(flwr):
        ret += len([i for i in lst[i] if not None])
    #print ret
    N -= 1
    break

Submission status: Runtime Error

Solution code:
while 1:
	n=input()
	if n==0:break
	hmax=1000
	block=[map(int,raw_input().split()) for i in range(n)]
	field=[[0]*5 for i in range(hmax)]
	for d,p,q in block:
		if d==1:
			for li in range(hmax-1,-1,-1):
				if field[li][q-1:q+p-1]!=[0]*p:
					field[li+1][q-1:q+p-1]=[1]*p
					break
			else:
				field[0][q-1:q+p-1]=[1]*p
		else:
			for li in range(hmax-1,-1,-1):
				if field[li][q-1]!=0:
					for i in range(p):
						field[li+i+1][q-1]=1
					break
			else:
				for i in range(p):
					field[li+i][q-1]=1
		i=0
		while 1:
			if field[i]==[1]*5:
				del field[i]
				hmax-=1
			elif field[i]==[0]*5:
				break
			else:
				i+=1
	print sum([sum(field[li]) for li in range(hmax)])

Submission status: Runtime Error

Solution code:
while 1:
	n=input()
	if n==0:break
	hmax=10000
	block=[map(int,raw_input().split()) for i in range(n)]
	field=[[0]*5 for i in range(hmax)]
	h=0
	for d,p,q in block:
		if d==1:
			for li in range(h+1,-2,-1):
				if field[li][q-1:q+p-1]!=[0]*p or li==-1:
					field[li+1][q-1:q+p-1]=[1]*p
					h=max(h,li+1)
					break
		else:
			for li in range(h+1,-2,-1):
				if field[li][q-1]!=0 or li==-1:
					for i in range(p):
						field[li+i+1][q-1]=1
					h=max(h,li+1+q)
					break
		i=0
		while 1:
			if field[i]==[1]*5:
				del field[i]
				h-=1
			elif field[i]==[0]*5:
				break
			else:
				i+=1
	print sum([sum(field[li]) for li in range(hmax)])

Submission status: Runtime Error

Solution code:
while 1:
	n=input()
	if n==0:break
	hmax=5000
	block=[map(int,raw_input().split()) for i in range(n)]
	field=[[0]*5 for i in range(hmax)]
	h=0
	for d,p,q in block:
		if d==1:
			for li in range(h,-2,-1):
				if field[li][q-1:q+p-1]!=[0]*p or li==-1:
					field[li+1][q-1:q+p-1]=[1]*p
					h=max(h,li+2)
					break
		else:
			for li in range(h,-2,-1):
				if field[li][q-1]!=0 or li==-1:
					for i in range(p):
						field[li+i+1][q-1]=1
					h=max(h,li+1+p)
					break
		i=0
		while 1:
			if field[i]==[1]*5:
				del field[i]
				h-=1
			elif field[i]==[0]*5:
				break
			else:
				i+=1
	print sum([sum(field[li]) for li in range(h)])