Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=1e5+7;
- int n,L,W;
- int ecnt;
- int fir[N],nex[N<<1],to[N<<1],w[N<<1];
- inline void addedge(int u,int v,int c){
- nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
- nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=c;
- }
- int SIZE,root;
- int s[N];
- int siz[N];
- bool vis[N];
- void getroot(int x,int f){
- siz[x]=1;
- s[x]=0;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(v==f||vis[v])continue;
- getroot(v,x);
- siz[x]+=siz[v];
- s[x]=max(s[x],siz[v]);
- }
- s[x]=max(s[x],SIZE-siz[x]);
- if(s[x]<s[root])root=x;
- }
- pair<int,int>tmp[N];
- int tot;
- void getdist(int x,int f,int dis,int dep){
- //if(dis>W||dep>L)return ;
- tmp[++tot]=make_pair(dis,dep);
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(v==f||vis[v])continue;
- getdist(v,x,dis+w[i],dep+1);
- }
- }
- int c[N];
- inline void insert(int x){
- for(int i=x+1;i<=n+1;i+=(i&-i))c[i]++;
- }
- inline void erase(int x){
- for(int i=x+1;i<=n+1;i+=(i&-i))c[i]--;
- }
- inline ll query(int x){
- if(x<0)return 0;
- ll ret=0;
- for(int i=x+1;i;i^=(i&-i))ret+=c[i];
- return ret;
- }
- inline ll calc(int x,int v,int d){
- tot=0;
- getdist(x,0,v,d);
- sort(tmp+1,tmp+tot+1);
- for(int i=1;i<=tot;++i){
- insert(tmp[i].second);
- }
- int l=1,r=tot;
- ll sum=0;
- while(l<r){
- if(tmp[l].first+tmp[r].first<=W){
- erase(tmp[l].second);
- sum+=query(L-tmp[l].second);
- ++l;
- }
- else {
- erase(tmp[r].second);
- --r;
- }
- }
- erase(tmp[l].second);
- return sum;
- }
- ll ans;
- void solve(int x,int size){
- ans+=calc(x,0,0);
- vis[x]=1;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(vis[v])continue;
- ans-=calc(v,w[i],1);
- s[root=0]=SIZE=(siz[v]>siz[x]?size-siz[x]:siz[v]);
- getroot(v,0);
- solve(root,SIZE);
- }
- }
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- r(n),r(L),r(W);
- for(int i=2;i<=n;++i){
- int v,w;r(v),r(w);
- addedge(i,v,w);
- }
- s[root]=SIZE=n;
- getroot(1,0);
- solve(root,n);
- cout<<ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement