#include <iostream>
#include <list>
#include <string>

using namespace std;

int n;

struct info{
	int r;
	bool b;
};

//pocetak saljemo lokalno
info rastojanje(list<int> veze[], int pocetak, int l, int r, bool posecene[], int gl[], int lg[], int orig[], int inv[])
{
	posecene[orig[pocetak]] = true;
	
	int max = -1;
	int tacka;
	bool nema_lr = true;
	
	for(int sledeci : veze[orig[pocetak]])
	{
		if(posecene[sledeci])
			continue;
		info in = rastojanje(veze, inv[sledeci], l, r, posecene, gl, lg, orig, inv);
		if(in.b && in.r>max)
		{
			max = in.r;
			nema_lr = false;
		}
	}
	
	//vracamo se
	posecene[orig[pocetak]] = false;
	
	//slepa ulica
	if(max == -1)
	    return {0, l <= lg[pocetak] && lg[pocetak] <= r};
	
	//nismo nasli ono sto trazimo
	if(nema_lr)
		return {0, false};
	
	//nasli smo ono sto trazimo
	return {max + 1, true};
}

int main()
{
	
	cin>>n;
	int lg[n], temp, orig[n], gl[n], inv[n];
	for(int i=0;i<n;i++)
	{
		cin>>temp;
		gl[i] = temp-1;
		lg[temp-1]=i;
		orig[temp-1]=i;
		inv[i] = temp-1;
	}
	
	list<int> veze[n];
	
	int u,v;
	for(int i=0;i<n-1;i++)
	{
		cin>>u>>v;
		veze[lg[u-1]].push_back(lg[v-1]);
		veze[lg[v-1]].push_back(lg[u-1]);
	}
	
	bool posecene[n];
	for(int i=0;i<n;i++)
		posecene[i] = false;
	
	int q;
	cin>>q;
	
	int izbor, a, b, l, r, x;
	
	for(int i=0;i<q;i++)
	{
		cin>>izbor;
		//menjanje
		if(izbor == 1)
		{
			cin>>a>>b;
			a--;b--;
			temp = gl[a];
			gl[a] = gl[b];
			gl[b] = temp;
			
			lg[gl[b]] = b;
			lg[gl[a]] = a;
		}
		//breadth first search
		else
		{
			cin>>l>>r>>x;
			cout << rastojanje(veze, x-1, l-1, r-1, posecene, gl, lg, orig, inv).r << endl;
		}
	}
	
    return 0;
}