/*
一遍DFS维护自身和子节点的前三个值
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#define MAXN 10009
using namespace std;
int n;
struct Node
{
int fa,val;
}node[MAXN];
struct Edge
{
int v,next;
}edge[3*MAXN];
int e;
bool cmp(int x,int y)
{
return x>y;
}
int first[MAXN],D[MAXN][6];
void addedge(int u,int v)
{
edge[e].v=v;
edge[e].next=first[u];first[u]=e++;
edge[e].v=u;
edge[e].next=first[v];first[v]=e++;
}
void init()
{
memset(first,-1,sizeof(first));
memset(D,-1,sizeof(D));
e=0;
int x,y;
scanf("%d",&node[0].val);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
node[i].fa=x;
node[i].val=y;
addedge(x,i);
}
}
void dfs(int x,int fa)
{
//cout<<"t";
D[x][0]=node[x].val;
for(int k=first[x];k!=-1;k=edge[k].next)
{
int v=edge[k].v;
if(v!=fa)
{
dfs(v,x);
sort(D[v],D[v]+6,cmp);//将子节点排序
for(int i=0;i<3;i++)
{
D[x][i+3]=D[v][i];
}
sort(D[x],D[x]+6,cmp);//自身排序
}
}
}
void solve()
{
dfs(0,-1);
int m,cmd;
scanf("%d",&m);
while(m--)
{
scanf("%d",&cmd);
if(D[cmd][2]==-1)
puts("-1");
else
{
printf("%d %d %d\n",D[cmd][0],D[cmd][1],D[cmd][2]);
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
solve();
}
}
ZOJ Monthly, July 2011 - G Tree of Three 3516
最新推荐文章于 2015-07-27 08:29:51 发布