#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
int n, q;
int a[N];
int p[N];
map<int, int> cnt[N]; // cnt[u][c] = Số đỉnh có màu c trong thành phần liên thông (tập hợp) do u đại diện
void initSet() {
for (int u = 1; u <= n; u++) {
p[u] = u;
cnt[u][a[u]] = 1;
}
}
int findSet(int u) {
if (p[u] == u) return u;
return p[u] = findSet(p[u]);
}
void unionSet(int u, int v) {
u = findSet(u);
v = findSet(v);
if (u == v) return;
if (cnt[u].size() < cnt[v].size()) swap(u, v);
p[v] = u;
for (auto it : cnt[v]) cnt[u][it.first] += it.second;
cnt[v].clear();
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for (int u = 1; u <= n; u++) cin >> a[u];
initSet();
while (q--) {
int type;
cin >> type;
if (type == 1) {
int u, v;
cin >> u >> v;
unionSet(u, v);
}
else {
int u, c;
cin >> u >> c;
u = findSet(u);
cout << (cnt[u].count(c) ? cnt[u][c] : 0) << '\n';
}
} // O(q + nlog^2(n))
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKCmludCBuLCBxOyAKaW50IGFbTl07IAoKaW50IHBbTl07IAptYXA8aW50LCBpbnQ+IGNudFtOXTsgLy8gY250W3VdW2NdID0gU+G7kSDEkeG7iW5oIGPDsyBtw6B1IGMgdHJvbmcgdGjDoG5oIHBo4bqnbiBsacOqbiB0aMO0bmcgKHThuq1wIGjhu6NwKSBkbyB1IMSR4bqhaSBkaeG7h24gCgp2b2lkIGluaXRTZXQoKSB7Cglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIHsKCQlwW3VdID0gdTsgIAoJCWNudFt1XVthW3VdXSA9IDE7IAoJfQp9CgppbnQgZmluZFNldChpbnQgdSkgewoJaWYgKHBbdV0gPT0gdSkgcmV0dXJuIHU7IAoJcmV0dXJuIHBbdV0gPSBmaW5kU2V0KHBbdV0pOyAKfQoKdm9pZCB1bmlvblNldChpbnQgdSwgaW50IHYpIHsKCXUgPSBmaW5kU2V0KHUpOyAKCXYgPSBmaW5kU2V0KHYpOyAKCWlmICh1ID09IHYpIHJldHVybjsgCglpZiAoY250W3VdLnNpemUoKSA8IGNudFt2XS5zaXplKCkpIHN3YXAodSwgdik7ICAKCXBbdl0gPSB1OyAgCglmb3IgKGF1dG8gaXQgOiBjbnRbdl0pIGNudFt1XVtpdC5maXJzdF0gKz0gaXQuc2Vjb25kOyAgIAoJY250W3ZdLmNsZWFyKCk7ICAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gcTsgCglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIGNpbiA+PiBhW3VdOyAKCglpbml0U2V0KCk7ICAKCgl3aGlsZSAocS0tKSB7CgkJaW50IHR5cGU7IAoJCWNpbiA+PiB0eXBlOyAKCgkJaWYgKHR5cGUgPT0gMSkgewoJCQlpbnQgdSwgdjsKCQkJY2luID4+IHUgPj4gdjsgCgkJCXVuaW9uU2V0KHUsIHYpOyAKCQl9CgkJZWxzZSB7CgkJCWludCB1LCBjOyAKCQkJY2luID4+IHUgPj4gYzsgCgkJCXUgPSBmaW5kU2V0KHUpOyAgIAoJCQljb3V0IDw8IChjbnRbdV0uY291bnQoYykgPyBjbnRbdV1bY10gOiAwKSA8PCAnXG4nOyAKCQl9Cgl9IC8vIE8ocSArIG5sb2deMihuKSkKfQ==