Problem:


  MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

プログラミングコンテスト II

白虎大学では毎年プログラミングコンテストを開催しています。コンテストは全てのチームの得点が 0の状態から開始し、解答状況に応じて得点が加算されていきます。このコンテストでは、得点の高い順に順位付けが行われます。チームの総数を N としたとき、チームには 1 から N の番号がそれぞれ割り当てられています。得点が同じ場合は番号がより小さい方が上位になります。

白虎大学では、コンテストを盛り上げるために観戦用のランキングシステムを開発しています。開発チームの一員であるあなたは、このシステムの一部であるプログラムの作成を任されています。

与えられた命令に従って、得点の更新と、指定された順位のチームの番号と得点を報告するプログラムを作成せよ。

Input

入力は以下の形式で与えられる。 

N C
command1
command2
:
commandC

１行目にチーム数 N (2 ≤ N ≤ 100000) と命令の数 C (1 ≤ C ≤ 100000)が与えられる。続く C 行に、１行ずつ命令が与えられる。各命令は以下の形式で与えられる。 

0 t p

または

1 m

最初の数字が0のとき更新命令、1のとき報告命令を表す。更新命令では指定された番号 t (1 ≤ t ≤ N) のチームに、整数で与えられる得点 p (1 ≤ p ≤ 109) を加算する。報告命令では指定された順位 m (1 ≤ m ≤ N) のチームの番号と得点を報告する。ただし、報告命令は少なくとも１回現れるものとする。 

Output

各報告命令に対して、指定された順位のチームの番号と得点を空白区切りで１行に出力する。 

Sample Input 1

3 11
0 2 5
0 1 5
0 3 4
1 1
1 2
1 3
0 3 2
1 1
0 2 1
1 2
1 3 

Sample Output 1

1 5
2 5
3 4
3 6
3 6
1 5

Sample Input 2

5 2
1 1
1 2

Sample Output 2

1 0
2 0



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


Sample output:
1 5
2 5
3 4
3 6
3 6
1 5

Submission status: Wrong Answer

Solution code:
i = input().split()
n = int(i[0])
c = int(i[1])

s = [0 for i in range(n)]
v = [i for i in range(n)]
f = True

for i in range(c):
    l = input().split()

    if l[0] == "0":
        t = int(l[1])
        p = int(l[2])
        s[t-1] += p
        f = False
    else:
        r = int(l[1])
        if f:
            v = sorted(range(len(s)),reverse=True,key=lambda k: s[k])
            f = True
        i = v[r-1]
        
        print("{0:d} {1:d}".format(i+1,s[i]))

Submission status: Time Limit Exceeded

Solution code:
i = input().split()
n = int(i[0])
c = int(i[1])

s = [0 for i in range(n)]

for i in range(c):
    l = input().split()

    if l[0] == "0":
        t = int(l[1])
        p = int(l[2])
        s[t-1] += p
    else:
        r = int(l[1])
        v = sorted(range(len(s)),reverse=True,key=lambda k: s[k])
        i = v[r-1]
        
        print("{0:d} {1:d}".format(i+1,s[i]))

Submission status: Time Limit Exceeded

Solution code:
i = input().split()
n = int(i[0])
c = int(i[1])

s = [0 for i in range(n)]
v = [i for i in range(n)]
f = True

for i in range(c):
    l = input().split()

    if l[0] == "0":
        t = int(l[1])
        p = int(l[2])
        s[t-1] += p
        f = False
    else:
        r = int(l[1])
        if f == False:
            v = sorted(range(len(s)),reverse=True,key=lambda k: s[k])
            f = True
        i = v[r-1]
        
        print("{0:d} {1:d}".format(i+1,s[i]))

Submission status: Time Limit Exceeded

Solution code:
N, C = map(int, input().split())
team = {i: 0 for i in range(1, N+1)}
tmp = None
for _ in range(C):
    command = list(map(int, input().split()))
    if command[0]:
        if tmp is None:
            tmp = sorted(team.items(), key=lambda x: (x[1], -x[0]))
        print(*tmp[-command[1]])
    else:
        team[command[1]] += command[2]
        tmp = None

Submission status: Accepted

Solution code:
def solve():
    from sys import stdin
    f_i = stdin
    
    N, C = map(int, f_i.readline().split())
    
    # ranking: [(score, team number), ...]
    ranking = [(0, i) for i in range(1, N + 1)]
    ranking.insert(0, (-1000000000 * C, 0))
    score = [0] * (N + 1)
    
    from bisect import bisect_left, insort
    ans = []
    for i in range(C):
        cmd = f_i.readline().split()
        if cmd[0] == '0':
            t, p = map(int, cmd[1:])
            pre_score = score[t]
            pre_rec = (pre_score, t)
            ranking.pop(bisect_left(ranking, pre_rec))
            new_score = pre_score - p # score is negative value
            score[t] = new_score
            insort(ranking, (new_score, t))
        else:
            m = int(cmd[1])
            p, t = ranking[m]
            ans.append(' '.join(map(str, (t, -p))))
    print('\n'.join(ans))

solve()

Submission status: Accepted

Solution code:
from bisect import bisect_left as bl

def main():
  n, c = map(int, input().split())
  ranking = [(0, i) for i in range(n)]
  points = [0 for _ in range(n)]
  for _ in range(c):
    com = input().split()
    if com[0] == "1":
      m = int(com[1]) - 1
      print(ranking[m][-1] + 1, -ranking[m][0])
    else:
      t, p = map(int, com[1:])
      t -= 1
      point = points[t]
      index = bl(ranking, (point, t))
      ranking.pop(index)
      new_point = point - p
      new_index = bl(ranking, (new_point, t))
      ranking.insert(new_index, (new_point, t))
      points[t] = new_point

main()