#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
const ll INF = 1e18 + 10;
const int maxn = 4e5 + 5;
const int mod = 1e9+7;
int fa[2 * maxn]; // 数值相同的位置集合
int b[maxn]; // 表示 0 - n 修改后的位置
int a[2 * maxn]; // 位置对应的值
map<int,int> mp; // 储存值对应的位置
int find(int x){
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int pos,int val){
if(mp[val]){
int y = mp[val];
fa[find(pos)] = find(y);
}else{
mp[val] = find(pos);
a[find(pos) ] = val;
}
}
void cover(int L,int R,int val){
for(auto t = mp.lower_bound(L); t != mp.end() && t->first <= R;t = mp.erase(t)){
merge(t->second,val);
// a[find(t->first)] = val;
}
}
int main()
{
IOS;
int _ = 1;
while(_--){
int n;
cin>>n;
for(int i = 1;i <= n;i++){
int w;
cin>>w;
a[i] = w;
fa[i] = b[i] = i;
merge(i,w);
}
int Q;
cin>>Q;
while(Q--){
int op;
cin>>op;
if(op == 1){
int pos;
int val;
cin>>pos>>val;
n++;
b[pos] = n;
fa[n] = n;
// a[n] = val;
merge(n,val);
}else if(op == 2){
int pos;
cin>>pos;
cout<<a[find(b[pos])]<<"\n";
}else{
int L,R;
cin>>L>>R;
int mid = (L + R) / 2;
cover(L,mid,L-1);
cover(mid + 1,R,R+1);
}
}
}
}