110 lines
1.4 KiB
C++
110 lines
1.4 KiB
C++
//not finish
|
|
#include<cstdio>
|
|
#include<vector>
|
|
using namespace std;
|
|
const int N=2e5+5,inf=0x3f3f3f3f;
|
|
int w[N],to[N],ne[N],h[N];
|
|
int cnt=0;
|
|
int n;
|
|
struct Node
|
|
{
|
|
int fa;
|
|
int sum;
|
|
int max;
|
|
int min;
|
|
int len;
|
|
int faw;
|
|
// vector<int> son;
|
|
} a[N];
|
|
void add(int u,int v,int w1)
|
|
{
|
|
a[v].fa=u;
|
|
a[v].faw=w1;
|
|
w[++cnt]=w1;
|
|
to[cnt]=v;
|
|
ne[cnt]=h[u];
|
|
h[u]=cnt;
|
|
}
|
|
void dfs(int u)
|
|
{
|
|
int v,vmax;
|
|
a[u].max=0;
|
|
a[u].min=inf;
|
|
a[u].len=0;
|
|
for(int i=h[u]; i; i=ne[i])
|
|
{
|
|
v=to[i];
|
|
dfs(v);
|
|
a[u].sum+=a[v].sum+w[i]*(a[v].len+1);
|
|
vmax=a[v].max+w[i];
|
|
a[u].max=a[u].max>vmax? a[u].max:vmax;
|
|
a[u].min=a[u].min<w[i]? a[u].min:w[i];
|
|
a[u].len+=a[v].len+1;
|
|
}
|
|
if(a[u].min==inf)
|
|
{
|
|
a[u].min=0;
|
|
}
|
|
// if(a[u].len==0)
|
|
// {
|
|
// a[u].len=1;
|
|
// }
|
|
}
|
|
void ce()
|
|
{
|
|
for(int i=1; i<=n; i++)
|
|
{
|
|
printf("%d:%d %d %d %d %d\n",i,a[i].fa ,a[i].max,a[i].min,a[i].sum,a[i].len );
|
|
}
|
|
}
|
|
void find(int )
|
|
{
|
|
if
|
|
}
|
|
int goup(int x,int k)
|
|
{
|
|
int u=x;
|
|
int sum=0;
|
|
int ans=0;
|
|
int len=0;
|
|
do
|
|
{
|
|
sum+=a[u].faw ;
|
|
if(len)
|
|
{
|
|
ans-=a[u].faw*a[u].len;
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
if(sum>=k)
|
|
{
|
|
ans=a[1].sum;
|
|
ans-=a[u].sum;
|
|
len=a[u].len+1;
|
|
ans-=a[u].faw*a[u].len;
|
|
}
|
|
u=a[u].fa;
|
|
}while(a[u].fa)
|
|
}
|
|
int main()
|
|
{
|
|
int u,v,w1;
|
|
scanf("%d",&n);
|
|
for(int i=2; i<=n; i++)
|
|
{
|
|
scanf("%d%d",&u,&w1);
|
|
add(u,i,w1);
|
|
}
|
|
dfs(1);
|
|
ce();
|
|
int q;
|
|
scanf("%d",&q);
|
|
while(q--)
|
|
{
|
|
scanf("%d%d",&x,&k);
|
|
pirntf("%d",goup(x,k));
|
|
}
|
|
}
|