#include<bits/stdc++.h>

#define EB emplace_back
#define int long long
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define endl '\n'
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)

using namespace std;

const int N = 2e5 + 10;

map < int, int > mp[N];

struct ufds{
  vector < int > par, len;
  ufds(int n){
    par.resize(n);
    len.resize(n, 1);
    for(int i = 0; i < n; i++){
      par[i] = i;
    }
  }    
  
  int find(int u){
    if(u == par[u]){
      return u;
    }
    return par[u] = find(par[u]);
  }
  
  void join(int u, int v){
    u = find(u);
    v = find(v);
    if(u == v){
      return;
    }
    if(len[u] < len[v]){
      swap(u, v);
    }
    len[u] += len[v];
    par[v] = u;
    for(auto x : mp[v]){
      mp[u][x.first] += x.second;
    }
  }
  
  void clear(){
    par.clear(), len.clear();
  }    
};    

void test_case(){
  int n, qq; cin >> n >> qq;
  int A[n];
  for(int i = 0; i < n; i++){
    cin >> A[i];
    A[i]--;
    mp[i][A[i]]++;
  }
  ufds dsu(n);
  while(qq--){
    int type, a, b; cin >> type >> a >> b;
    type--, a--, b--;
    if(!type){
      dsu.join(a, b);
    }
    else{
      cout << mp[dsu.find(a)][b] << endl;
    }
  }
}

int32_t main(){
  IOS;
  int tt = 1; 
  //cin >> tte;
  while(tt--){
    test_case();
    //cout << endl;
  }
  return 0;
}

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=4e5+10;
int n,m,cnt;
int used[maxn];
struct sb{
	int now,pre,to,va;
}e[maxn*3];
inline void add(int a,int b,int c){e[++cnt].pre=e[a].now;e[cnt].va=c;e[cnt].to=b;e[a].now=cnt;}
void dfs(int u){
	for(int i=e[u].now;i;i=e[i].pre){
		int v=e[i].to,va=e[i].va;
		if(!used[v]){
			if(used[u]==va){used[v]=(va+1)%(n+1);}
			else{used[v]=va;}
			dfs(v);
		}
	}
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1,x,y,c;i<=m;i++){
    	scanf("%d%d%d",&x,&y,&c);
    	add(x,y,c);add(y,x,c);
	}
	used[1]=1;
	dfs(1);
	bool flag=false;
	for(int i=1;i<=n;i++){
		if(!used[i]){
			puts("No");
			flag=true;break;
		}
	}
	if(!flag){for(int i=1;i<=n;i++){printf("%d\n",used[i]);}}
	return 0;
}






