Buggy python submission (verdict: Runtime Error):
while True:
    N,M = map(int,input().split())
    if N == 0:
        break
    expect = 0
    a = []
    exsum = 0
    for i in range(N): #二次元配列を作る
        a.append(list(map(int,input().split())))
        exsum += a[i][0]*a[i][1] #誰も雇わなかった場合の期待値
    b = sorted(a, key=lambda x: x[1]) #危険度の高い区間ほど後ろにくるように並べる
    i = N-1
    while M > 0: #危険度が高い区間（配列のうしろ）から順に人を雇っていく
        if b[i][0] <= M:
            exsum -= b[i][0]*b[i][1]
            M -= b[i][0]
            i -= 1
        else:
            exsum -= b[i][1]*M
            M = 0
            i -= 1
    print(exsum)


Fixed submission:
while True:
    N,M = map(int,input().split())
    if N == 0:
        break
    expect = 0
    a = []
    exsum = 0
    for i in range(N): #二次元配列を作る
        a.append(list(map(int,input().split())))
        exsum += a[i][0]*a[i][1] #誰も雇わなかった場合の期待値
    b = sorted(a, key=lambda x: x[1]) #危険度の高い区間ほど後ろにくるように並べる
    i = N-1
    while M > 0 and i >= 0: #危険度が高い区間（配列のうしろ）から順に人を雇っていく
        if b[i][0] <= M:
            exsum -= b[i][0]*b[i][1]
            M -= b[i][0]
            i -= 1
        else:
            exsum -= b[i][1]*M
            M = 0
            i -= 1
    print(exsum)

Buggy python submission (verdict: Runtime Error):
while True:
    N,M = map(int,input().split())
    if N == 0:
        break
    expect = 0
    a = []
    exsum = 0
    for i in range(N): #二次元配列を作る
        a.append(list(map(int,input().split())))
        exsum += a[i][0]*a[i][1] #誰も雇わなかった場合の期待値
    b = sorted(a, key=lambda x: x[1]) #危険度の高い区間ほど後ろにくるように並べる
    i = N-1
    while M > 0: #危険度が高い区間（配列のうしろ）から順に人を雇っていく
        if b[i][0] <= M:
            exsum -= b[i][0]*b[i][1]
            M -= b[i][0]
            i -= 1
        else:
            exsum -= b[i][1]*M
            M = 0
            i -= 1
    print(exsum)


Fixed submission:
while True:
    N,M = map(int,input().split())
    if N == 0:
        break
    expect = 0
    a = []
    exsum = 0
    for i in range(N): #二次元配列を作る
        a.append(list(map(int,input().split())))
        exsum += a[i][0]*a[i][1] #誰も雇わなかった場合の期待値
    b = sorted(a, key=lambda x: x[1]) #危険度の高い区間ほど後ろにくるように並べる
    i = N-1
    while M > 0 and i >= 0: #危険度が高い区間（配列のうしろ）から順に人を雇っていく
        if b[i][0] <= M:
            exsum -= b[i][0]*b[i][1]
            M -= b[i][0]
            i -= 1
        else:
            exsum -= b[i][1]*M
            M = 0
            i -= 1
    print(exsum)

Buggy python submission (verdict: Runtime Error):
while True:
    N,M = map(int,input().split())
    if N == 0:
        break
    expect = 0
    a = []
    exsum = 0
    for i in range(N): #二次元配列を作る
        a.append(list(map(int,input().split())))
        exsum += a[i][0]*a[i][1] #誰も雇わなかった場合の期待値
    b = sorted(a, key=lambda x: x[1]) #危険度の高い区間ほど後ろにくるように並べる
    i = N-1
    while M > 0: #危険度が高い区間（配列のうしろ）から順に人を雇っていく
        if b[i][0] <= M:
            exsum -= b[i][0]*b[i][1]
            M -= b[i][0]
            i -= 1
        else:
            exsum -= b[i][1]*M
            M = 0
            i -= 1
    print(exsum)


Fixed submission:
while True:
    N,M = map(int,input().split())
    if N == 0:
        break
    expect = 0
    a = []
    exsum = 0
    for i in range(N): #二次元配列を作る
        a.append(list(map(int,input().split())))
        exsum += a[i][0]*a[i][1] #誰も雇わなかった場合の期待値
    b = sorted(a, key=lambda x: x[1]) #危険度の高い区間ほど後ろにくるように並べる
    i = N-1
    while M > 0 and i >= 0: #危険度が高い区間（配列のうしろ）から順に人を雇っていく
        if b[i][0] <= M:
            exsum -= b[i][0]*b[i][1]
            M -= b[i][0]
            i -= 1
        else:
            exsum -= b[i][1]*M
            M = 0
            i -= 1
    print(exsum)