



&preview=true)




#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7,maxm=4e5+7;
typedef long long ll;
inline ll read(){
ll s = 0, w = 1; char ch = getchar();
while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
int head[maxn],to[maxm],Next[maxm],tot;
ll val[maxm];
struct node{
int id,l,r;
ll dis,w;
bool operator<(const node& a)const{
return dis>a.dis;
}
}q[maxn];
struct sum{
int l,r;
ll dis;
bool operator<(const sum& a)const{
return dis>a.dis;
}
}a[maxn];
void add(int x,int y,ll c) {
to[++tot]=y;
Next[tot]=head[x];
val[tot]=c;
head[x]=tot;
}
int num;
void dfs(int u,int fa) {
a[u].l=++num;
for(int i=head[u];i;i=Next[i]) {
int v=to[i];
if(v==fa) continue;
a[v].dis=a[u].dis+val[i];
dfs(v,u);
}
a[u].r=num;
}
ll cnt[maxn],all[maxn],n;
#define lowbit(x) (x&(-x))
void add(int x,ll val) {
while(x<=n) {
cnt[x]+=1;
all[x]+=val;
x+=lowbit(x);
}
}
ll query(int x,int op) {
ll res1=0,res2=0;
while(x) {
res1+=cnt[x];
res2+=all[x];
x-=lowbit(x);
}
return op?res1:res2;
}
ll ans[maxn];
int main() {
n=read();
for(int i=2,p,c;i<=n;++i) {
p=read(),c=read();
add(p,i,c);
add(i,p,c);
}
dfs(1,0);
int Q=read();
for(int i=1,x,k;i<=Q;++i) {
x=read(),k=read();
q[i].id=i;
q[i].dis=a[x].dis+k;
q[i].w=a[x].dis;
q[i].l=a[x].l;
q[i].r=a[x].r;
}
sort(q+1,q+1+Q);
sort(a+1,a+1+n);
for(int i=1,j=1;i<=Q;++i) {
while(a[j].dis>=q[i].dis) {
add(a[j].l,a[j].dis);
++j;
}
ans[q[i].id]=query(q[i].r,0)-query(q[i].l,0);
ans[q[i].id]-=(query(q[i].r,1)-query(q[i].l,1))*q[i].w;
}
for(int i=1;i<=Q;++i) printf("%lld\n",ans[i]);
}