#include <bits/stdc++.h>
const int N = 1e5;
#define ll long long
using namespace std;

int n, m;
int a[N+3];
vector<map<int, int>> v(N+3);
int parent[N+3], sz[N+3];

void make(){
    for(int i=1;i<=n;i++){
        v[i][a[i]] = 1;
        parent[i] = i;
        sz[i] = 1;
    }

}

int find(int v){
    if(v == parent[v])return v;
    int res = find(parent[v]);
    parent[v] = res;
    return res;
}

void Union(int a, int b){
    a = find(a);
    b = find(b);
    if(a != b){
        if(sz[a] < sz[b])swap(a, b);
        parent[b] = a;
        sz[a] += sz[b];
        for(auto res : v[b])v[a][res.first] += res.second;
        v[b].clear();
    }
}

void query(int a, int b){
    a = find(a);
    if(v[a].find(b) != v[a].end())cout<<v[a][b]<<"\n";
    else cout<<0<<"\n";
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }

    make();
    while(m--){
        int x, y, z;
        cin>>x>>y>>z;
        if(x == 1)Union(y, z);
        else query(y, z);
    }
    return 0;
}
