Problem:
Rank Checker

時は2020 年。パソコン甲子園 2020 の予選結果を保存したデータがあります。このデータには、各チームに振られる整理番号と正解数が保存されています。ここでは、正解数で順位を決定するものとし、正解数の多いほうから順に 1 位、2 位 ... と順位をつけていくこととします。

予選結果のデータと整理番号をキーボードから入力して、その番号のチームの順位を出力するプログラムを作成してください。

Input

入力データは２つの部分からなります。前半の部分は、予選結果のデータ、後半の部分は順位を知りたいチーム番号の問い合わせです。予選結果のデータの形式は以下の通りです。

p1,s1
p2,s2
...
...
0,0

pi (1 ≤ pi ≤ 100 )、 si (0 ≤ si ≤ 30) はそれぞれ i チーム目の整理番号と正解数を表す整数です。整理番号と正解数がともに 0 のときこのデータの入力が終わるものとします。

続いて後半の問い合わせが複数与えられます。問い合わせの形式は以下の通りです。

q1
q2
:

各問い合わせは１行に整理番号 qi (1 ≤ qi ≤ 30) が与えられます。これを入力の最後まで処理して下さい。問い合わせの数は 100 を超えません。

Output

各問い合わせについて、チームの順位を１行に出力して下さい。

Sample Input

1,20
2,20
3,30
4,10
5,10
6,20
0,0
1
2
4
5

Output for the Sample Input

2
2
3
3

Note

入力例のデータにおいて、チームを正解数順に整列すると：

3,30
1,20
2,20
6,20
4,10
5,10

となります。ここでは、正解数を基に順位を決定するため、30問正解チームを1位、20問正解チームを2位、10問正解チームを3位とします（上位のチーム数を考慮し、10問正解チームを5位とする通常の順位付けとは異なることに注意して下さい）。

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static class Team {
		int number;
		int score;
		int rank;
		
		Team(Integer number, Integer score) {
			this.number = number;
			this.score = score;
		}

		public String toString() {
			return "{number: " + number + "score: " + score + "rank: " + rank + "}";
		}
	}
	
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		String str[];
		ArrayList<Team> team = new ArrayList<Team>();
		int count;
		
		count = 0;
		while (true) {
			str = sc.next().split(",");
			if (str[0].equals("0") && str[1].equals("0")) {
				break;
			}
			team.add(new Team(Integer.valueOf(str[0]), Integer.valueOf(str[1])));
			count++;
		}
		quickSort(team, 0, count - 1);
		team.get(0).rank = 1;
		for (int i = 1; i < team.size(); i++) {
			if (team.get(i).score == team.get(i - 1).score) {
				team.get(i).rank = team.get(i - 1).rank;
			} else {
				team.get(i).rank = team.get(i - 1).rank + 1;
			}
		}
		while (sc.hasNext()) {
			int a = sc.nextInt();
			for (int i = 0; i < team.size(); i++) {
				if (team.get(i).number == a) {
					System.out.println(team.get(i).rank);
				}
			}
		}
	}
	
	public static void quickSort(ArrayList<Team> team, int low, int high) {
		if (high <= low) {
			return ;
		}
		int i = low;
		int j = high;
		int x = team.get((low + high) / 2).score;
		while (i <= j) {
			while (x < team.get(i).score) {
				i++;
			}
			while (team.get(j).score < x) {
				j--;
			}
			if (i <= j) {
				Team swap = new Team(team.get(i).number, team.get(i).score);
				team.get(i).score = team.get(j).score;
				team.get(i).number = team.get(j).number;
				team.get(j).score = swap.score;
				team.get(j).number = swap.number;
				i++;
				j--;
			}
		}
		quickSort(team, low, j);
		quickSort(team, i, high);
	}
}