#include <bits/stdc++.h>
#define fu(i,a,b) for (int i=a; i<=b; i++)
#define int long long
const int maxn=1e5;
using namespace std;
int n,q; vector<int> a,R,dept; map<int,int> color[maxn+5];
void init(){
cin >> n >> q;
a.resize(n+1); R.resize(n+1); dept.resize(n+1);
fu(i,1,n){
cin >> a[i];
R[i]=i;
color[i][a[i]]++;
}
}
int get_root(int u){
while(R[u]!=u) u=R[u];
return u;
}
void connect(int root, int child){
R[child]=root;
for(auto [x,cnt]: color[child]) color[root][x]+=cnt;
color[child].clear();
}
void dsu(int u, int v){
int ru = get_root(u),rv=get_root(v);
if(ru!=rv){
if(dept[ru]>dept[rv]) connect(ru,rv);
else if(dept[ru]<dept[rv]) connect(rv,ru);
else{
connect(ru,rv);
dept[ru]++;
}
}
}
void solve(){
while(q--){
int tmp,x,y; cin >> tmp >> x >> y;
if(tmp==1) dsu(x,y);
else cout << color[get_root(x)][y] << "\n";
}
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
init();
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZnUoaSxhLGIpIGZvciAoaW50IGk9YTsgaTw9YjsgaSsrKQojZGVmaW5lIGludCBsb25nIGxvbmcKY29uc3QgaW50IG1heG49MWU1Owp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbixxOyB2ZWN0b3I8aW50PiBhLFIsZGVwdDsgbWFwPGludCxpbnQ+IGNvbG9yW21heG4rNV07Cgp2b2lkIGluaXQoKXsKICAgIGNpbiA+PiBuID4+IHE7CiAgICBhLnJlc2l6ZShuKzEpOyBSLnJlc2l6ZShuKzEpOyBkZXB0LnJlc2l6ZShuKzEpOwogICAgZnUoaSwxLG4pewogICAgICAgIGNpbiA+PiBhW2ldOwogICAgICAgIFJbaV09aTsKICAgICAgICBjb2xvcltpXVthW2ldXSsrOwogICAgfQp9CgppbnQgZ2V0X3Jvb3QoaW50IHUpewogICAgd2hpbGUoUlt1XSE9dSkgdT1SW3VdOyAKICAgIHJldHVybiB1Owp9Cgp2b2lkIGNvbm5lY3QoaW50IHJvb3QsIGludCBjaGlsZCl7CiAgICBSW2NoaWxkXT1yb290OwogICAgZm9yKGF1dG8gW3gsY250XTogY29sb3JbY2hpbGRdKSBjb2xvcltyb290XVt4XSs9Y250OwogICAgY29sb3JbY2hpbGRdLmNsZWFyKCk7Cn0KCnZvaWQgZHN1KGludCB1LCBpbnQgdil7CiAgICBpbnQgcnUgPSBnZXRfcm9vdCh1KSxydj1nZXRfcm9vdCh2KTsKICAgIGlmKHJ1IT1ydil7CiAgICAgICAgaWYoZGVwdFtydV0+ZGVwdFtydl0pIGNvbm5lY3QocnUscnYpOwogICAgICAgIGVsc2UgaWYoZGVwdFtydV08ZGVwdFtydl0pIGNvbm5lY3QocnYscnUpOwogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGNvbm5lY3QocnUscnYpOwogICAgICAgICAgICBkZXB0W3J1XSsrOwogICAgICAgIH0KICAgIH0KfQoKCnZvaWQgc29sdmUoKXsKICAgIHdoaWxlKHEtLSl7CiAgICAgICAgaW50IHRtcCx4LHk7IGNpbiA+PiB0bXAgPj4geCA+PiB5OwogICAgICAgIGlmKHRtcD09MSkgZHN1KHgseSk7CiAgICAgICAgZWxzZSBjb3V0IDw8IGNvbG9yW2dldF9yb290KHgpXVt5XSA8PCAiXG4iOwogICAgfQp9CgpzaWduZWQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpOyAKICAgIGluaXQoKTsKICAgIHNvbHZlKCk7Cn0K