#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#define N 10010
using namespace std;
int val[N];
int parent[N];
int head[N];
int dp[N][10];
struct node
{
int i;
int next;
}nodes[N];
int tot;
void addedge(int u,int v)
{
nodes[tot].i=v;
nodes[tot].next=head[u];
head[u]=tot++;
}
void insert(int u,int v)
{
int i;
for(i=0;i<3;i++)
dp[u][i+4]=dp[v][i];
sort(dp[u],dp[u]+10,greater<int>());
}
void solve(int u)
{
if(head[u]==-1)
{
dp[u][0]=val[u];
return;
}
int next=head[u];
int v;
while(next!=-1)
{
v=nodes[next].i;
solve(v);
insert(u,v);
next=nodes[next].next;
}
dp[u][9]=val[u];
sort(dp[u],dp[u]+10,greater<int>());
}
int main()
{
int m,n,i,j,v;
while(~scanf("%d",&n))
{
memset(head,-1,sizeof(head));
memset(parent,-1,sizeof(parent));
memset(dp,-1,sizeof(dp));
memset(nodes,-1,sizeof(nodes));
tot=0;
scanf("%d",&val[0]);
for(i=1;i<n;i++)
{
scanf("%d%d",&v,&val[i]);
addedge(v,i);
}
solve(0);
scanf("%d",&m);
while(m--)
{
scanf("%d",&i);
bool flag=true;
for(j=0;j<3;j++)
if(dp[i][j]==-1)
{
flag=false;
break;
}
if(flag)
{
printf("%d %d %d\n",dp[i][0],dp[i][1],dp[i][2]);
}
else
printf("-1\n");
}
}
}
zoj3516
最新推荐文章于 2014-08-01 12:24:45 发布