#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct stu{
char name[11];//练习使用顺序表;
double score;
int list;}s[1005];
int com0(struct stu p,struct stu q)//此处不同;
{
return (strcmp(p.name,q.name));
}
int equal(double p,double q){
if((fabs(p-q))<1e-6)
return 1;
else
return 0;}
int com1(struct stu p,struct stu q){
if(equal(p.score,q.score)==0&&p.score>q.score)
return 1;
return 0;}
int main(){
int com0(struct stu p,struct stu q);
int com1(struct stu p,struct stu q);
int n,m;
while(scanf("%d%d",&n,&m)==2){
int i,d=0;int h;
for(i=0;i<n;i++){
for(h=0;h<11;h++){s[i].name[h]='/0';}
scanf("%s%lf",s[i].name,&s[i].score);
s[i].list=1;
//输入所有的名字和分数
}
d=n;
sort(s,s+d,com0);//sort()按名字;
for(i=0;i<d-1;i++){
if(strcmp(s[i].name,s[i+1].name)==0){
s[i].score=(s[i].score+s[i+1].score)*0.50000;
int q;
for(q=i+1;q<d-1;q++){//很可能是这个循环出了问题
s[q].score=s[q+1].score;
s[q].list=s[q+1].list;
strcpy(s[q].name,s[q+1].name);
}
d=d-1;
}
}//检查相邻的节点的名字是否相同;利用指针移动;并处理;
stable_sort(s,s+d,com1);
s[0].list=1;
for(i=1;i<d;i++){
if(equal(s[i].score,s[i-1].score)==1)
s[i].list=s[i-1].list;
else
s[i].list=s[i-1].list+1;}//sort()按分数; 并赋值给名次;相同的分数名次相同;
int a,x;
for(i=1;i<=m;i++){
scanf("%d",&x);
int j;
for(j=0;j<d;j++){
if(s[j].list==x){
a=j;break;}
a=-1;}
if(a!=-1){
printf("%s",s[a].name);
while(1){
a=a+1;
if(a<d&&s[a].list==x){
printf(" ");
printf("%s",s[a].name);}
else{
printf("/n");break;}}}
else
printf("Invalid/n");
}//输出相应名次的 名字; 从下标==名次开始;找不到就输出invalin;
}
return 0;}