优先级队列
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define maxn 150005
#define INF 0xfffff
using namespace std;
int name[maxn][205];
struct node{
int ord,val;
bool operator <(const node& a)const {
return val <a.val ||(val==a.val&&ord>a.ord);
}
}p[maxn];
struct no{
int th,num;
}h[maxn];
bool cmp(no a,no b){
return a.th<b.th;
}
int ans[maxn];
priority_queue<node> Q;
int main(){
int n,m,k,T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++){
scanf("%s%d",name[i],&p[i].val);
p[i].ord=i+1;
}
for(int i=0;i<m;i++)
scanf("%d%d",&h[i].th,&h[i].num);
sort(h,h+m,cmp);
int cor=0,A=1;
for(int i=0;i<n;i++){
Q.push(p[i]);
if(i+1==h[cor].th&&cor<m){
int j=0;
while(!Q.empty()&&j<h[cor].num){
ans[A++]=Q.top().ord;
Q.pop();
j++;
}
cor++;
}
}
while(!Q.empty()){
ans[A++]=Q.top().ord;
Q.pop();
}
int a;
for(int i=0;i<k;i++){
scanf("%d",&a);
if(i==0)
printf("%s",name[ans[a]-1]);
else
printf(" %s",name[ans[a]-1]);
}
printf("\n");
}
return 0;
}