显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
ll e,maxn[12];
}a[110000];
ll n,m,k;
ll d,p,maxm[12][110000],ans[12][110000];
ll maxn[12][110000];
bool cmp(node aa,node bb){
return aa.maxn[k]<bb.maxn[k];
}
int main(){
// freopen("in.in","r",stdin);
freopen("Ski.in","r",stdin);
freopen("Ski.out","w",stdout);
scanf("%lld",&n);
for(int i=2;i<=n;i++){
scanf("%lld %lld %lld",&p,&d,&a[i].e);
a[i].e+=a[p].e;
for(int j=1;j<=11;j++){
maxm[j][i]=maxm[j][p];
}
for(int j=1;j<=11;j++){
if(d>maxm[j][i])
swap(d,maxm[j][i]);
a[i].maxn[j]=maxm[j][i];
}
}
for(k=1;k<=11;k++){
sort(a+1,a+1+n,cmp);
for(int i=2;i<=n;i++){
ans[k][i]=max(ans[k][i-1],a[i].e);
maxn[k][i]=a[i].maxn[k];
}
}
scanf("%lld",&m);
while(m--){
ll u,v;
scanf("%lld %lld",&u,&v);
v+=1;
ll j=upper_bound(maxn[v]+1,maxn[v]+n+1,u)-maxn[v]-1;
printf("%lld\n",ans[v][j]);
}
return 0;
}