每个人有个名字和带的礼物的价值,当门外有很多人时,让礼物价值大的排在前面,礼物价值相同时,让先来的人排在前面,没有两个人会同时来,题目给出来的顺序
m个操作,每个操作有个t和p代表是当第t个人来时让p个人进屋子。当最后一个人也来了的时候,所有人都可以直接进屋子。
q个询问,每个询问给出一个编号i,求第i个进屋子的人的名字
代码:
#include
#include
#include
#include
#include
using namespace std;
#define N 150010
struct Node
{
char name[210];
int id;
long long val;
} e[N];
bool operator <(Node a,Node b)
{
if(a.val==b.val) return a.id>b.id;
return a.valq;
int ans[N];
int main()
{
int T,t,p;
int n,m,Q,now,cnt;
scanf("%d",&T);
while(T--)
{
now=1;
cnt=1;
scanf("%d %d %d",&n,&m,&Q);
for(int i=1; i<=n; i++)
{
scanf("%s %lld",e[i].name,&e[i].val);
e[i].id=i;
}
for(int i=1; i<=m; i++)
{
scanf("%d %d",&t,&p);
for(int i=now; i<=t; i++)
{
if(now>n) continue;
q.push(e[now++]);
}
if(now>n)
while(!q.empty())
{
Node w=q.top();
ans[cnt++]=w.id;
q.pop();
}
else
{
for(int i=1; i<=p; i++)
{
if(!q.empty())
{
Node w=q.top();
ans[cnt++]=w.id;
q.pop();
}
}
}
}
while(!q.empty())
{
Node w=q.top();
ans[cnt++]=w.id;
q.pop();
}
for(int i=1;i<=Q;i++)
{
scanf("%d",&t);
printf("%s",e[ans[t]].name);
if(i!=Q) printf(" ");
else printf("\n");
}
}
return 0;
}