#include <bits/stdc++.h>
using namespace std;
vector <int> v[80010],pomocni_vektor;
int n,p[80010],a,b,q,cifra,pocetno,najdalje,krajnje,naselje1,naselje2;
long long res,moguce_res;
bool posecen [80010];

void dfs(int cvor,int dubina){
    posecen[cvor]=true;
    if(najdalje==cvor){
        moguce_res=dubina;
        
    }
    for(int i=0;i<v[cvor].size();i++){
        if(posecen[v[cvor][i]]==false){
            dfs(v[cvor][i],dubina+1);
        }
    }
}

int main(){
    scanf("%d", &n);
    for(int i=1;i<=n;i++){
        scanf("%d",&p[i]);
    }
    for(int i=1;i<n;i++){
        scanf("%d %d", &a,&b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
    scanf("%d",&q);
    int brojac=1;
    for(int k=1;k<=q;k++){
        scanf("%d",&cifra);
        if(cifra==2){
            res=0;
            scanf("%d %d %d",&pocetno,&krajnje,&najdalje);
            for(int j=pocetno;j<=krajnje;j++){
                memset(posecen,0,sizeof(posecen));
                dfs(p[j],0);

                res=max(res,moguce_res);
            }
            printf("%lld \n",res);
            brojac++;
        }
        else{
            scanf("%d %d", &naselje1,&naselje2);
            pomocni_vektor=v[naselje1];
            v[naselje1]=v[naselje2];
            v[naselje2]=pomocni_vektor;
            
            for(int i=0;i<v[naselje1].size();i++){
                for(int j=0;j<v[v[naselje1][i]].size();j++){
                    if(naselje2==v[v[naselje1][i]][j]){
                        v[v[naselje1][i]][j]=naselje1;
                        break;
                    }
                }
            }
            for(int i=0;i<v[naselje2].size();i++){
                for(int j=0;j<v[v[naselje2][i]].size();j++){
                    if(naselje1==v[v[naselje2][i]][j]){
                        v[v[naselje2][i]][j]=naselje2;
                        break;
                    }
                }
            }
        }
    }



    return 0;
}