#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5, mod = 1e9 + 7;
int par[N], t[N], u[N], v[N], n, Q, k, endd[N];
vector<int> comp[N], q[N];
vector<pair<int, int> > tree[4 * N];
stack<pair<int, int> > st;
string second;
void merge(int u, int v) {
  u = par[u];
  v = par[v];
  if (comp[u].size() < comp[v].size()) swap(u, v);
  st.push({u, v});
  for (int i = 0; i < comp[v].size(); i++) {
    comp[u].push_back(comp[v][i]);
    par[comp[v][i]] = u;
  }
}
void undo(int u, int v) {
  for (int i = 0; i < comp[v].size(); i++) {
    par[comp[v][i]] = v;
    comp[u].pop_back();
  }
}
void insert(int U, int start, int endd, int l, int r, int i) {
  if (l > endd || r < start) return;
  if (start <= l && r <= endd) {
    tree[U].push_back({u[i], v[i]});
    return;
  }
  int mid = (l + r) / 2;
  insert(2 * U, start, endd, l, mid, i);
  insert(2 * U + 1, start, endd, mid + 1, r, i);
}
void dfs(int u, int l, int r) {
  int cnt = 0;
  for (int i = 0; i < tree[u].size(); i++) {
    if (par[tree[u][i].second] != par[tree[u][i].first])
      cnt++, merge(tree[u][i].first, tree[u][i].second);
  }
  if (l == r) {
    for (int i = 0; i < q[l].size(); i++) {
      cout << comp[par[q[l][i]]].size() << " ";
    }
    while (cnt--) {
      undo(st.top().first, st.top().second);
      st.pop();
    }
    return;
  }
  int mid = (l + r) / 2;
  dfs(2 * u, l, mid);
  dfs(2 * u + 1, mid + 1, r);
  while (cnt--) {
    undo(st.top().first, st.top().second);
    st.pop();
  }
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> Q >> k;
  for (int i = 1; i <= n; i++) {
    par[i] = i;
    comp[i].push_back(i);
  }
  int T = 1, c = 0;
  for (int i = 1; i <= Q; i++) {
    cin >> t[i];
    int g;
    if (t[i] != 3) c++;
    if (t[i] == 3)
      endd[T] = c, T++;
    else if (t[i] == 2)
      cin >> g, q[c].push_back(g);
    else
      cin >> u[i] >> v[i];
  }
  endd[T] = c;
  c = 1;
  int cur = 1;
  for (int i = 1; i <= Q; i++) {
    if (t[i] == 1) {
      int lst = endd[cur + k - 1];
      if (!lst) lst = endd[T];
      insert(1, c, lst, 1, endd[T], i);
    }
    if (t[i] == 3)
      cur++;
    else
      c++;
  }
  dfs(1, 1, endd[T]);
}
