holiday/8.20/C.cpp
2022-08-22 22:19:52 +08:00

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));
}
}