#include <bits/stdc++.h>
using namespace std;
const int N = 2e6;
struct P {
  int x, y, k;
};
vector<P> G[N];
P tmp[N];
void update(int root, int l, int r, int L, int R, P a) {
  if (l == L && r == R) {
    G[root].push_back(a);
    return;
  }
  int mid = (l + r) / 2;
  if (R <= mid)
    update(root * 2, l, mid, L, R, a);
  else if (L > mid)
    update(root * 2 + 1, mid + 1, r, L, R, a);
  else {
    update(root * 2, l, mid, L, mid, a);
    update(root * 2 + 1, mid + 1, r, mid + 1, R, a);
  }
}
vector<int> A[500010];
int p[100010], siz[100010];
int f(int x) {
  if (p[x] == x) return x;
  return f(p[x]);
}
void dfs(int root, int l, int r) {
  int i, a, b, len = 0;
  P u;
  for (i = 0; i < G[root].size(); i++) {
    u = G[root][i];
    a = f(u.x);
    b = f(u.y);
    if (a != b) {
      if (siz[a] > siz[b]) swap(a, b);
      tmp[++len].k = 1;
      tmp[len].x = a;
      tmp[len].y = p[a];
      tmp[++len].k = 2;
      tmp[len].x = b;
      tmp[len].y = siz[b];
      p[a] = b;
      siz[b] += siz[a];
    }
  }
  G[root].clear();
  for (i = 1; i <= len; i++) G[root].push_back(tmp[i]);
  if (l != r) {
    int mid = (l + r) / 2;
    dfs(root * 2, l, mid);
    dfs(root * 2 + 1, mid + 1, r);
  } else {
    for (i = 0; i < A[l].size(); i++) {
      a = f(A[l][i]);
      printf("%d\n", siz[a]);
    }
    A[l].clear();
  }
  for (i = G[root].size() - 1; i >= 0; i--) {
    u = G[root][i];
    if (u.k == 1)
      p[u.x] = u.y;
    else
      siz[u.x] = u.y;
  }
  G[root].clear();
}
int a[500010], b[500010], c[500010], vis[500010];
int main() {
  int i, n, m = 1, q, k, x, ma;
  scanf("%d%d%d", &n, &q, &k);
  for (i = 1; i <= q; i++) {
    scanf("%d", &a[i]);
    if (a[i] == 1)
      scanf("%d%d", &b[i], &c[i]);
    else if (a[i] == 2)
      scanf("%d", &b[i]);
    else
      m++;
    vis[m] = i;
  }
  ma = m;
  m = 1;
  for (i = 1; i <= q; i++) {
    if (a[i] == 1) {
      x = m + k - 1;
      if (x <= ma)
        x = vis[x];
      else
        x = q;
      update(1, 1, q, i, x, P{b[i], c[i]});
    } else if (a[i] == 2)
      A[i].push_back(b[i]);
    else
      m++;
  }
  for (i = 1; i <= n; i++) {
    p[i] = i;
    siz[i] = 1;
  }
  dfs(1, 1, q);
}
