#include <bits/stdc++.h>
const int maxn = 1e6 + 5;
using namespace std;
int rd() {
  int x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = (x << 3) + (x << 1) + c - '0', c = getchar();
  return x * f;
}
struct undo_dsu {
  stack<pair<int, int> > s;
  ;
  int fa[maxn], sz[maxn];
  void init(int N) {
    for (int i = 1; i <= N; i++) fa[i] = i, sz[i] = 1;
  }
  int find(int x) {
    while (fa[x] != x) x = fa[x];
    return x;
  }
  void merge(int x, int y) {
    int fx = find(x), fy = find(y);
    if (fx == fy) return;
    if (sz[fx] > sz[fy]) swap(fx, fy);
    fa[fx] = fy;
    sz[fy] += sz[fx];
    s.push(make_pair(fx, fy));
  }
  void undo() {
    pair<int, int> x = s.top();
    s.pop();
    fa[x.first] = x.first;
    sz[x.second] -= sz[x.first];
  }
} dsu;
int n, q, k, tim = 1, cur[maxn], tmp[maxn], cnt, ans[maxn];
pair<int, int> lst[maxn];
vector<pair<int, int> > vec[maxn << 2], qu[maxn];
void modify(int p, int l, int r, int sl, int sr, pair<int, int> x) {
  if (sl <= l && r <= sr) {
    vec[p].push_back(x);
    return;
  }
  int mid = (l + r) >> 1;
  if (sl <= mid) modify(p << 1, l, mid, sl, sr, x);
  if (mid < sr) modify(p << 1 | 1, mid + 1, r, sl, sr, x);
}
void dfs(int p, int l, int r) {
  int now = dsu.s.size();
  for (int i = 0; i < (int)vec[p].size(); i++)
    dsu.merge(vec[p][i].first, vec[p][i].second);
  if (l == r) {
    for (int i = 0; i < (int)qu[l].size(); i++) {
      int fx = dsu.find(qu[l][i].second);
      ans[qu[l][i].first] = dsu.sz[fx];
    }
    while ((int)dsu.s.size() > now) dsu.undo();
    return;
  }
  int mid = (l + r) >> 1;
  dfs(p << 1, l, mid);
  dfs(p << 1 | 1, mid + 1, r);
  while ((int)dsu.s.size() > now) dsu.undo();
}
int main() {
  n = rd();
  q = rd();
  k = rd();
  dsu.init(n);
  for (int op, x, y, i = 1; i <= q; i++) {
    op = rd();
    if (op == 1) {
      x = rd();
      y = rd();
      cur[i] = tim;
      lst[i] = make_pair(x, y);
    } else if (op == 2) {
      x = rd();
      qu[i].push_back(make_pair(++cnt, x));
    } else
      ++tim, tmp[tim] = i;
  }
  for (int i = 1; i <= q; i++) {
    if (!cur[i]) continue;
    if (cur[i] + k > tim)
      modify(1, 1, q, i, q, lst[i]);
    else
      modify(1, 1, q, i, tmp[cur[i] + k], lst[i]);
  }
  dfs(1, 1, q);
  for (int i = 1; i <= cnt; i++) printf("%d\n", ans[i]);
  return 0;
}
