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
#include <bits/stdc++.h>
using namespace std;

#define loop(i, a, b) for(int i = a; i <= b; i++)
#define loop_rev(i, a, b) for(int i = a; i >= b; i--)
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define eb emplace_back
#define pb push_back

using ui = uint32_t;
using ll = int64_t;

vector<vector<int>> cnt, mind;
vector<int> sizes;

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int k, n; cin >> k >> n;

  sizes.resize(k + 1);
  cnt.resize(k + 1);
  mind.resize(k + 1);
  
  // level 1
  cnt[1].resize(n + 1);
  mind[1].resize(n + 1, 1);
  sizes[1] = n;

  for(int i = 2; i <= k; i++) {
    int c; cin >> c;
    sizes[i] = c;
    cnt[i].resize(c + 1);
    mind[i].resize(c + 1);
    for(int j = 1; j <= c; j++) {
      int v; cin >> v;
      if(v == 0) {
        mind[i][j] = i;
      }
      else {
        mind[i][j] = mind[i - 1][v];
        ++cnt[i - 1][v];
      }
    }
  }

  multiset<int> free;
  free.insert(-1e9);
  int res = 0;

  for(int w = 1; w <= k; w++) {
    for(int i = 1; i <= sizes[w]; i++) {
      if(cnt[w][i] == 0) {
        auto it = --free.upper_bound(mind[w][i]);
        if(*it != -1e9 && *it <= mind[w][i]) {
          free.erase(it);
        }
        else {
          ++res;
        }
        free.insert(w + 1);
      }
    }
  }

  cout << res << '\n';

}