#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();
}
