1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* 
 * Author: KarolB
 * Time: 2026-03-23 15:46:28
**/

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

constexpr int MAXN = 1e6+6;
typedef pair<int, int> pii;

int n = 1;
int par[MAXN];
vector<int> kra[MAXN];
int layer[MAXN];
int row0[MAXN];

int l0[MAXN];

void add(int p, int l){
  int i = n++;
  if(p != 0){
    kra[p].push_back(i);
    par[i] = p;
  }
  layer[i] = l;
}

int pref[MAXN];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int k, n0;
  cin >> k >> n0;
  row0[1] = 0;
  for(int i = 1; i <= n0; i++){
    add(0, 1);
  }
  for(int r = 2; r <= k; r++){
    row0[r] = n-1;
    int ni;
    cin >> ni;
    while(ni--){
      int p; cin >> p;
      add(p + (p>0)*row0[r-1], r);
    }
  }
  n--;
  // for(int i = 1; i <= n; i++){
  //   cerr << i << ' ' << layer[i] << ' ' << row0[layer[i]] << ' ' << par[i] << " : ";
  //   for(int j : kra[i]) cerr << j << ' ';
  //   cerr << '\n';
  // }

  vector<pii> it;

  for(int i = 1; i <= n; i++){
    if(par[i] == 0) l0[i] = layer[i];
    else{
      l0[i] = l0[par[i]];
    }
    if(kra[i].size() == 0)
      it.push_back({l0[i], layer[i]});
  }
  for(auto &[l, r] : it){
    pref[l]++;
    pref[r+1]--;
    // cerr << l << ' ' << r << '\n';
  }
  int res = 0;
  int sum = 0;
  for(int i = 1; i <= n; i++){
    sum += pref[i];
    res = max(res, sum);
  }
  cout << res << '\n';
  return 0;
}