#include <iostream>
#include <vector>

using namespace std;

void kereses(vector<vector<int>> ut,int telepulesek,int g,vector<bool> a,int x,int *vegosszeg,int l)
{
    if(telepulesek==x)
    {
        vegosszeg[l]=g;
        l++;
        return;
    }
    a[telepulesek]=true;
    for(int i=0;i<ut[telepulesek].size();i++)
    {
        if(!a[ut[telepulesek][i]]){
        kereses(ut,ut[telepulesek][i],g++,a,x,vegosszeg,l);
        }
    }
}
int main()
{
    int n,n2,p,x,y,l,r;
cin>>n;
int telepulesek[n],eredmenyek[n],o=0,eredm[n],t=0,max=0,vegsoeredm[n];
vector<vector<int>> ut(n+2);
for(int i=1;i<=n;i++)
{
    cin>>telepulesek[i];
}
for(int i=1;i<n;i++)
{
    cin>>x;
    cin>>y;
    ut[x].push_back(y);
    ut[y].push_back(x);
}

cin>>n2;
for(int i=0;i<n2;i++)
{
    cin>>p;
    if(p==1)
    {
        cin>>x>>y;
        int u=telepulesek[x];
        telepulesek[x]=telepulesek[y];
        telepulesek[y]=u;
    }
    else
        if(p==2)
    {
        max=0;
        cin>>l>>r>>x;
        for(int j=l;j<=r;j++)
        {
            int vegosszeg[n];
            vector<bool> a(n,false);
            kereses(ut,telepulesek[j],0,a,x,vegosszeg,0);
                    int min=9999999999;
        for(int ik=0;vegosszeg[ik]<n;ik++)
        {
            if(vegosszeg[ik]<min)
            {
                min=vegosszeg[ik];
            }
        }
        if(min>max&&min<n)
        {
            max=min;
        }
        }
        vegsoeredm[o]=max;
        o++;

    }
}
for(int i=0;i<o;i++)
{
    cout<<vegsoeredm[i]<<endl;
}
}