fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. #define canuc12k ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  5. int n, a[300005];
  6. int seg[1500005];
  7. int spr[20][300005];
  8. int high[300005];
  9. int elt[300005], sz[300005], stt[300005];
  10. vector<int> g[300005];
  11. int u, cnt=1;
  12. int dfs(int a, int par){
  13. spr[0][a]=par;
  14. // cout<<a<<"\n";
  15. elt[cnt]=a;
  16. stt[a]=cnt;
  17. cnt++;
  18. for(auto i : g[a]){
  19. if(i==par) continue;
  20. high[i]=high[a]+1;
  21. sz[a]+=dfs(i,a);
  22. }
  23. return sz[a]+1;
  24. }
  25. void update(int pos, int l, int r, int u, int val){
  26. if(l>u || r<u) return;
  27. if(l==r){
  28. seg[pos]=val;
  29. return;
  30. }
  31. int mid=(l+r)>>1;
  32. update(pos*2, l, mid, u, val);
  33. update(pos*2+1, mid+1, r, u, val);
  34. seg[pos]=max(seg[pos*2], seg[pos*2+1]);
  35. }
  36. int get(int pos, int l, int r, int u, int v){
  37. if(l>v || r<u) return 0;
  38. if(l>=u && r<=v) return seg[pos];
  39. int mid=(l+r)>>1;
  40. return max(get(pos*2, l, mid, u, v), get(pos*2+1, mid+1, r, u, v));
  41. }
  42. int main(){
  43. canuc12k
  44.  
  45. cin>>n;
  46. cin>>a[1];
  47. for(int i=2;i<=n+1;i++){
  48. cin>>a[i]>>u;
  49. g[u+1].pb(i);
  50. g[i].pb(u+1);
  51. }
  52. n++;
  53. dfs(1,1);
  54. for(int i=1;i<=19;i++){
  55. for(int j=1;j<=n;j++){
  56. spr[i][j]=spr[i-1][spr[i-1][j]];
  57. }
  58. }
  59.  
  60. update(1, 1, n, stt[1], a[1]);
  61.  
  62. for(int i=2;i<=n;i++){
  63. int x = i;
  64. for(int k = log2(high[i]); k >= 0; k--) {
  65. int cha = spr[k][x];
  66. int val = get(1, 1, n, stt[cha], stt[cha]+sz[cha]);
  67. if(val < a[i]) x = spr[k][x];
  68. }
  69.  
  70. cout << high[i] - high[x] <<"\n";
  71.  
  72. update(1, 1, n, stt[i], a[i]);
  73. }
  74. }
Success #stdin #stdout 0.01s 38756KB
stdin
Standard input is empty
stdout
Standard output is empty