Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<stdio.h>
- #include<algorithm>
- #include<set>
- #include<map>
- #include<queue>
- #include<stack>
- #include<deque>
- #include<vector>
- #include<string>
- #include<math.h>
- using namespace std;
- #define INF 1000000000
- #define lint long long
- #define pb push_back
- #define mp make_pair
- #define MOD 1000000007
- vector <int> g[100005];
- int m;
- int dfs(int v,int k)
- {
- int i;
- int sum=1,cnt=0;
- multiset <int> s;
- for(i=0;i<g[v].size();++i)
- {
- int to=g[v][i];
- int cur=dfs(to,k);
- s.insert(cur);
- sum+=cur;
- ++cnt;
- while(cnt>k)
- {
- sum-=*s.begin();
- s.erase(s.begin());
- --cnt;
- }
- }
- return sum;
- }
- int check(int f)
- {
- if(dfs(1,f)>=m)return 1;
- return 0;
- }
- int main()
- {
- int n,i,j,x;
- scanf("%d %d",&n,&m);
- for(i=2;i<=n;++i)
- {
- scanf("%d",&x);
- g[x].pb(i);
- }
- if(check(0))
- {
- cout<<0;
- return 0;
- }
- int l=0,r=n+1;
- while(r-l>3)
- {
- int mid=(r+l)/2;
- if(check(mid))
- {
- r=mid;
- }
- else l=mid;
- }
- for(i=l;i<=r;++i)
- {
- if(check(i))
- {
- cout<<i;
- return 0;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement