#include <bits/stdc++.h>
using namespace std;
map <int, vector<int> >mapcugica;
bool vis[80000];
queue < int > q;
int udaljenost[80000];
void bfs(int node)
{
vis[node]=true;
for (int i = 0; i < mapcugica[node].size(); i++) 
{
if(vis[mapcugica[node][i]] == 0) 
{
q.push(mapcugica[node][i]);
if(udaljenost[mapcugica[node][i]]==0)
udaljenost[mapcugica[node][i]]=udaljenost[node]+1;
}
}
q.pop();
if(q.size() == 0) 
return;
bfs(q.front());
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin>>n;
int niz[80001];
for(int i=1;i<=n;i++)
{
cin>>niz[i];
}
for(int i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
mapcugica[a].push_back(b);
mapcugica[b].push_back(a);
}
q.push(1);
bfs(1);
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int a;
cin>>a;
if(a==1)
{
int p1,p2;
cin>>p1>>p2;
swap(niz[p1],niz[p2]);
}
else
{
int l,r,x;
cin>>l>>r>>x;
if(x==1)
{
int maks=0;
for(int j=l;j<=r;j++)
if(udaljenost[niz[j]]>maks)
maks=udaljenost[niz[j]];
cout<<maks<<endl;
}
else
{
int maks=0;
for(int j=l;j<=r;j++)
{
if(abs(udaljenost[x]-udaljenost[niz[j]])>maks)
maks=abs(udaljenost[x]-udaljenost[niz[j]]);
}
cout<<maks<<endl;
}
}
}
return 0;
}