#include <bits/stdc++.h>   namespace IO {   template <typename T>   inline void read(T &x) {     x = 0;     int f = 1;     char ch = getchar();     while (ch >  9  || ch <  0 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 )       x = (x << 3) + (x << 1) + ch -  0 , ch = getchar();     x *= f;     return;   }   template <typename T>   inline void write(T x = 0) {     T wr[51];     wr[0] = 0;     if (x < 0) putchar( - ), x = -x;     if (!x) putchar(48);     while (x) wr[++wr[0]] = x % 10, x /= 10;     while (wr[0]) putchar(48 + wr[wr[0]--]);     return;   }   }  // namespace IO   using IO::read;   using IO::write;   using namespace std;   const int N = 4e6 + 11;   int n, m, top, now, k;   int op[N], a[N], b[N], fa[N], sz[N], sa[N], sb[N], cur[N], ti[N];   vector<pair<int, int> > v[N];   void modify(int x, int y, int a, int b, int k, int l, int r) {     if (x <= l && r <= y) {       v[k].push_back(pair<int, int>(a, b));       return;     }     int mid = (l + r) >> 1;     if (x <= mid) modify(x, y, a, b, k << 1, l, mid);     if (mid < y) modify(x, y, a, b, k << 1 | 1, mid + 1, r);   }   int find(int x) { return fa[x] == x ? x : find(fa[x]); }   void merge(int x, int y) {     x = find(x), y = find(y);     if (x == y) return;     if (sz[x] < sz[y]) swap(x, y);     sa[++top] = x, sb[top] = y;     sz[x] += sz[y];     fa[y] = x;   }   void del(int tim) {     int x, y;     while (top > tim) {       x = sa[top], y = sb[top];       fa[y] = y, sz[x] -= sz[y];       --top;     }   }   void dfs(int k, int l, int r) {     int t = top;     for (auto s : v[k]) merge(s.first, s.second);     if (l == r) {       if (op[l] == 2) printf( %d n , sz[find(a[l])]);       del(t);       return;     }     int mid = (l + r) >> 1;     dfs(k << 1, l, mid), dfs(k << 1 | 1, mid + 1, r);     del(t);   }   int main() {     read(n);     read(m);     read(k);     for (int i = 1; i <= n; ++i) fa[i] = i, sz[i] = 1;     for (int i = 1; i <= m; ++i) {       read(op[i]);       if (op[i] == 1)         read(a[i]), read(b[i]), cur[i] = now;       else if (op[i] == 2)         read(a[i]), cur[i] = now;       else         ti[++now] = i, cur[i] = now;     }     for (int i = 1; i <= m; ++i)       if (op[i] == 1) {         if (cur[i] + k > now)           modify(i, m, a[i], b[i], 1, 1, m);         else           modify(i, ti[cur[i] + k], a[i], b[i], 1, 1, m);       }     dfs(1, 1, m);     return 0;   }   