#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;

float inf=numeric_limits<float>::infinity();

int dajnaj(vector<bool> poseceni,float udalj[],int n){
	float min=inf;
	int grad;
	for(int i=0;i<n;i++){
		if(!poseceni[i]&&udalj[i]!=inf){
			if(udalj[i]<=min){
				min=udalj[i];
				grad=i;
			}
		}
	}
	return grad;
}


int main(){
	ios_base::sync_with_stdio(false);
	int n;cin>>n;
	vector<int> gradovi;
	for(int i=0;i<n;i++){
		int x;cin>>x;
		gradovi.push_back(x);
	}
	int graf[n][n];
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			graf[i][j]=0;
		}
	}
	for(int i=0;i<n-1;i++){
		int x,y;cin>>x>>y;
		graf[x-1][y-1]=1;
		graf[y-1][x-1]=1;
	}
	int q;cin>>q;
	for(int i=0;i<q;i++){
		int x;cin>>x;
		if(x==1){
			int a,b;
			cin>>a>>b;
			int a1=gradovi[a-1];
			int b1=gradovi[b-1];
			swap(gradovi[a-1],gradovi[b-1]);
		}
		else{
			int l,r,p;
			cin>>l>>r>>p;
			float udalj[n];
			auto it=find(gradovi.begin(),gradovi.end(),p);
			int src=it-gradovi.begin();
			for(int o=0;o<n;o++){
				udalj[o]=inf;
			}
			udalj[src]=0;
			vector<bool> poseceni(n,false);
			for(int w=0;w<n;w++){
				int najblizi=dajnaj(poseceni,udalj,n);
				poseceni[najblizi]=true;
				for(int j=0;j<n;j++){
					auto ir=find(gradovi.begin(),gradovi.end(),j+1);
					int idu=ir-gradovi.begin();
					if(graf[gradovi[najblizi]-1][j]!=0&&udalj[idu]>udalj[najblizi]+1){
						udalj[idu]=udalj[najblizi]+1;
					}
				}
			}
			int max=0;
			for(int e=l-1;e<=r-1;e++){
				if(udalj[e]>max){
					max=udalj[e];
				}
			}
			cout<<max<<endl;
			
		}
	}
	return 0;
}