#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, q, pd, dy, m = 1, qn;
pair<int, int> qr[N * 5], mdf[N * 5];
int lson[N * 10], rson[N * 10];
vector<pair<int, int> > val[N * 10];
vector<pair<pair<int, int>, int> > ins[N * 10];
int ans[N * 5], p[N], sz[N], dep[N], st[N * 5], ed[N * 5], dt[N * 5];
void build(int pos, int x, int y) {
  if (x == y) return;
  int mid = (x + y) >> 1;
  lson[pos] = ++m;
  rson[pos] = ++m;
  build(lson[pos], x, mid);
  build(rson[pos], mid + 1, y);
}
void modify(int pos, int x, int y, int l, int r, pair<int, int> vl) {
  if (x >= l && y <= r) {
    val[pos].push_back(vl);
    return;
  }
  if (x > r || y < l) return;
  int mid = (x + y) >> 1;
  modify(lson[pos], x, mid, l, r, vl);
  modify(rson[pos], mid + 1, y, l, r, vl);
}
int fp(int x) { return (x == p[x]) ? x : fp(p[x]); }
void solve(int pos, int x, int y) {
  for (int i = 0; i < val[pos].size(); i++) {
    int X = val[pos][i].first;
    int Y = val[pos][i].second;
    X = fp(X);
    Y = fp(Y);
    if (X != Y) {
      if (dep[X] < dep[Y]) swap(X, Y);
      p[Y] = X;
      sz[X] += sz[Y];
      ins[pos].push_back(make_pair(make_pair(X, Y), dep[X] == dep[Y]));
      dep[X] += (dep[X] == dep[Y]);
    }
  }
  if (x != y) {
    int mid = (x + y) >> 1;
    solve(lson[pos], x, mid);
    solve(rson[pos], mid + 1, y);
  } else {
    int X = qr[x].first;
    int Y = qr[x].second;
    if (X != -1) ans[Y] = sz[fp(X)];
  }
  reverse(ins[pos].begin(), ins[pos].end());
  for (int i = 0; i < ins[pos].size(); i++) {
    int X = ins[pos][i].first.first;
    int Y = ins[pos][i].first.second;
    int Z = ins[pos][i].second;
    p[Y] = Y;
    sz[X] -= sz[Y];
    dep[X] -= Z;
  }
}
int main() {
  scanf("%d%d%d", &n, &q, &pd);
  q++;
  build(1, 1, q);
  for (int i = 1; i <= q; i++) {
    mdf[i] = make_pair(-1, -1);
    qr[i] = make_pair(-1, -1);
    int op, x, y;
    if (i != 1)
      scanf("%d", &op);
    else
      op = 3;
    if (op == 1) {
      scanf("%d%d", &x, &y);
      mdf[i] = make_pair(x, y);
      ed[dy] = i;
    } else if (op == 2) {
      scanf("%d", &x);
      qr[i] = make_pair(x, ++qn);
      ed[dy] = i;
    } else {
      st[++dy] = i;
      ed[dy] = i;
    }
    dt[i] = dy;
  }
  for (int i = 1; i <= n; i++) {
    p[i] = i;
    sz[i] = dep[i] = 1;
  }
  for (int i = 1; i <= q; i++)
    if (mdf[i].first != -1)
      modify(1, 1, q, i, ed[min(dy, dt[i] + pd - 1)], mdf[i]);
  solve(1, 1, q);
  for (int i = 1; i <= qn; i++) printf("%d\n", ans[i]);
  return 0;
}
