#include <bits/stdc++.h>
using namespace std;
// https://w...content-available-to-author-only...s.org/ordered-set-gnu-c-pbds/
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define rep(i,s,e) for(int i=s ; i < e ; i++)
#define rrep(i,s,e) for(int i=s ; i > e ; i--)
#define srep(i,s,e,j) for(int i=s ; i < e ; i+=j)
#define tr(i,x) for(auto i : x)
#define vinp(a) for(int i=0 ; i<a.size() ; i++)cin>>a[i]
#define ainp(a,n) for(int i=0; i<n; i++)cin>>a[i]
#define int long long
#define vi vector<int>
#define vvi vector<vector<int>>
#define vs vector<string>
#define vb vector<bool>
#define vpi vector<pii>
#define maxpqi priority_queue<int>
#define minpqi priority_queue <int, vector<int>, greater<int> >
#define mem0(x) memset(x, 0, sizeof(x))
#define mem1(x) memset(x, -1, sizeof(x))
#define pii pair<int,int>
#define F first
#define S second
#define mk make_pair
#define pb push_back
#define pf push_front
#define endl '\n'
#define gcd(a,b) __gcd(a,b)
#define clr(x) memset(x,0,sizeof(x))
#define lb lower_bound
#define ub upper_bound
#define npos string::npos
#define all(x) x.begin(),x.end()
#define sayyes cout << "YES" << endl
#define sayno cout << "NO" << endl
// --------------- TEMPLATE ENDS ---------------
#define MXNUM 100005
class DSU{
public:
// 1 indexed;
int N;
vector<int>p;
DSU(int len){
N = len;
p.resize(N+1, -1);
}
int Find(int i){
if(p[i] < 0)return i;
return p[i] = Find(p[i]);
}
};
vi a;
vi colorToIndex;
void solve(int tcase){
int N, Q; cin >> N >> Q;
DSU dsu(N);
colorToIndex.clear();
colorToIndex.resize(MXNUM, -1);
a.clear();
a.resize(N+1);
rep(i, 1, N+1){
int col; cin >> col;
if(colorToIndex[col] == -1)
colorToIndex[col] = i;
dsu.p[i] = -col;
}
// Now the task is to segregate all indices of same color together.
rep(i, 1, N+1){
int rCur = dsu.Find(i);
int curCol = -dsu.p[rCur];
if(colorToIndex[curCol] == rCur) continue;
dsu.p[colorToIndex[curCol]] = rCur;
colorToIndex[curCol] = rCur;
}
vi ans;
while(Q--){
int op; cin >> op;
if(op == 1){
int cur, next; cin >> cur >> next;
// Edge case: 1 x x
if(cur == next) continue;
// CASE1: color cur is not present.
if(colorToIndex[cur] == -1) continue;
// CASE2: cur is present & next is not present.
if(colorToIndex[next] == -1){
int idxCur = colorToIndex[cur];
// erase all current colors.
colorToIndex[cur] = -1;
int rCur = dsu.Find(idxCur);
dsu.p[rCur] = -next;
colorToIndex[next] = rCur;
}
// CASE2: both cur & next are present.
else if(colorToIndex[cur] != -1 && colorToIndex[next] != -1){
int idxCur = colorToIndex[cur];
int idxNext = colorToIndex[next];
// erase all current colors.
colorToIndex[cur] = -1;
int rCur = dsu.Find(idxCur);
int rNext = dsu.Find(idxNext);
dsu.p[rCur] = rNext;
colorToIndex[next] = rNext;
}
}else{
int idx; cin >> idx;
int rIdx = dsu.Find(idx);
ans.pb(dsu.p[rIdx]);
}
}
cout << "Case " << tcase << ":" << endl;
for(int x: ans)cout << -x << endl;
}
int32_t main(){
fastio
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int tt = 1;
cin >> tt;
rep(i, 1, tt+1){
solve(i);
}
return 0;
}