Qualifying Contest (CodeForces - 659B)结构体排序(每个地区取成绩前两名)

                                                  Qualifying Contest

                                                                     time limit per test 1 second

                                                             memory limit per test 256 megabytes

                                                                          input standard input

                                                                        output standard output

Very soon Berland will hold a School Team Programming Olympiad. From each of the m Berland regions a team of two people is invited to participate in the olympiad. The qualifying contest to form teams was held and it was attended by n Berland students. There were at least two schoolboys participating from each of the m regions of Berland. The result of each of the participants of the qualifying competition is an integer score from 0 to 800 inclusive.

The team of each region is formed from two such members of the qualifying competition of the region, that none of them can be replaced by a schoolboy of the same region, not included in the team and who received a greater number of points. There may be a situation where a team of some region can not be formed uniquely, that is, there is more than one school team that meets the properties described above. In this case, the region needs to undertake an additional contest. The two teams in the region are considered to be different if there is at least one schoolboy who is included in one team and is not included in the other team. It is guaranteed that for each region at least two its representatives participated in the qualifying contest.

Your task is, given the results of the qualifying competition, to identify the team from each region, or to announce that in this region its formation requires additional contests.

Input

The first line of the input contains two integers n and m (2 ≤ n ≤ 100 000, 1 ≤ m ≤ 10 000, n ≥ 2m) — the number of participants of the qualifying contest and the number of regions in Berland.

Next n lines contain the description of the participants of the qualifying contest in the following format: Surname (a string of length from 1 to 10 characters and consisting of large and small English letters), region number (integer from 1 to m) and the number of points scored by the participant (integer from 0 to 800, inclusive).

It is guaranteed that all surnames of all the participants are distinct and at least two people participated from each of the m regions. The surnames that only differ in letter cases, should be considered distinct.

Output

Print m lines. On the i-th line print the team of the i-th region — the surnames of the two team members in an arbitrary order, or a single character “?” (without the quotes) if you need to spend further qualifying contests in the region.

Examples

input

5 2
Ivanov 1 763
Andreev 2 800
Petrov 1 595
Sidorov 1 790
Semenov 2 503

output

Sidorov Ivanov
Andreev Semenov

input

5 2
Ivanov 1 800
Andreev 2 763
Petrov 1 800
Sidorov 1 800
Semenov 2 503

output

?
Andreev Semenov

Note

In the first sample region teams are uniquely determined.

In the second sample the team from region 2 is uniquely determined and the team from region 1 can have three teams: “Petrov”-“Sidorov”, “Ivanov”-“Sidorov”, “Ivanov” -“Petrov”, so it is impossible to determine a team uniquely.

题解

题意简单来说就是:有n个人,来自m个地区,每个地区题上至少给出两人,要求找出每个地区段位(得分)最高的两个人去打亡者农药比赛。如果只有两个人,那肯定就这两个人去了,如果多于两个,就需要判断分数第二高和第三高的人分数是否相同,如果相同,按题上说就需要内部再进行比赛,怎么体现呢?输出“?”就好了。。管他比不比、怎么比。

 

建一个参赛人的结构体,包括名字,段位(分数)和地区。按地区排序,如果地区相同就按分数从高到低排序啦。再判断每个地区第二和三的分数就OK

# include <cstdio>
# include <algorithm>

using namespace std;
const int maxn = 1e5 + 10;


struct node{
	char na[10];
	int lo;
	int gr;
}peo[maxn];

bool cmp(struct node x, struct node y)
{
	if(x.lo == y.lo) return x.gr > y.gr;
	return x.lo < y.lo;
}
int main()
{
	int n, m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++) scanf("%s%d%d",peo[i].na,&peo[i].lo,&peo[i].gr);
	
	sort(peo,peo+n,cmp);
	int s = 0;
	for(int i=0;i<n;i++)
	{
		if(s >= 0)
		{
			if(peo[s+1].lo == peo[s+2].lo && peo[s+1].gr == peo[s+2].gr) 
			{
				printf("?\n");
				s = -1;
			}
			else 
			{
				printf("%s %s\n",peo[s].na,peo[s+1].na);
				s = -1;
			}
		}
		
		if(peo[i].lo != peo[i+1].lo) s = i+1; 
	}
	
	return 0;
 } 

 

点赞