#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define sz(x) (int)(x).size()
#define all(x) x.begin(), x.end()
using namespace std;

const char nl='\n';
const int MOD=1000000007;
const int N=200005;

int n,a,b,L,R,x,res,tree[2*N],u[N],kv,p[N],poc[N];
queue<int>q;
vector<int>v[N];
bool vis[N];

void napravi(){
    for(int i=0;i<n;i++)tree[i+n]=poc[i];
    for(int i=n-1;i>0;--i)tree[i]=max(tree[2*i],tree[2*i+1]);
}

void apdejt(int id,int vr){
    id+=n;
    tree[id]=vr;
    for(int i=id;i>1;i>>=1)tree[i>>1]=max(tree[i],tree[i^1]);
}

int kveri(int l,int r){/// [l,r)
    int res=0;
    for(l+=n,r+=n;l<r;l>>=1,r>>=1){
      if(l&1)res=max(res,tree[l++]);
      if(r&1)res=max(res,tree[--r]);
    }
    return res;
}

void bfs(int x){
    q.push(x);
    vis[x]=true;
    while(q.size()){
        x=q.front();
        for(int i=0;i<v[x].size();i++){
            if(!vis[v[x][i]]){
                u[v[x][i]]=u[x]+1;
                q.push(v[x][i]);
                vis[v[x][i]]=true;
            }
        }
        q.pop();
    }
}


void solve(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>p[i];
    }

    for(int i=1;i<n;i++){
        cin>>a>>b;
        v[a].pb(b);
        v[b].pb(a);
    }
    if(n<=4000){
        cin>>kv;
        for(int i=1;i<=kv;i++){
            int tip;
            cin>>tip;
            if(tip==1){cin>>a>>b;swap(p[a-1],p[b-1]);}
            else{
                cin>>L>>R>>x;
                u[x]=res=0;
                bfs(x);
                for(int i=L-1;i<R;i++){
                    res=max(res,u[p[i]]);
                }
                cout<<res<<nl;
            }
        }
    }
    else{
        bfs(1);
        for(int i=0;i<n;i++){
            poc[i]=u[p[i]];
        }
        napravi();
        cin>>kv;
        for(int i=1;i<=kv;i++){
            int tip;
            cin>>tip;
            if(tip==1){
                cin>>a>>b;
                a--;b--;
                int temp=tree[a+n];
                apdejt(a,tree[b+n]);
                apdejt(b,temp);
            }
            else{
               cin>>L>>R>>x;
               L--;
               cout<<kveri(L,R)<<nl;
            }
        }

    }
}
int main () {
cin.tie(NULL);
ios_base::sync_with_stdio(false);

int T=1;
//cin>>T;
while(T--){
    solve();
}

return 0;
}