#include <bits/stdc++.h>
using namespace std;

#define ios ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define inf INT_MAX
#define llinf LLONG_MAX
#define mt make_tuple
#define mp make_pair
#define parll pair<ll,ll>
#define parii pair<int,int>
#define nzd __gcd
#define nzs(e1,e2) (e1/nzd(e1,e2))*e2
#define all(V) V.begin(),V.end()
#define min3(brp1,brp2,brp3) min(brp1,min(brp2,brp3))
#define min4(brp1,brp2,brp3,brp4) min(brp1,min3(brp2,brp3,brp4))
#define max3(brp1,brp2,brp3) max(brp1,max(brp2,brp3))
#define max4(brp1,brp2,brp3,brp4) max(brp1,max3(brp2,brp3,brp4))
#define l_b(BRL,brl) lower_bound( BRL.begin(), BRL.end(), brl )-BRL.begin()-1 /// !za one based! vraca mani iako brl postoji, vraca 0 kada ne postoji manji
#define u_b(BRU,bru) upper_bound( BRU.begin(), BRU.end(), bru )-BRU.begin() /// !za one based! vraca veci iako bru postoji, vraca n+1 kada ne postoji veci
#define mod 1000000007
#define mxn 4002

ll n,q,D[mxn][mxn],u,v;
vector <ll> G[mxn],P(mxn);
vector <bool> V(mxn,false);

void DFS( ll root, ll i, ll d )
{
    V[i] = true;
    D[root][i] = d;
    for ( auto next : G[i] )
    {
        if ( !V[next] )
        {
            DFS(root,next,d+1);
        }
    }
}

int main()
{
    ios;

    cin >> n;
    for ( ll i = 1; i <= n; i++ )
    {
        cin >> P[i];
    }

    for ( ll i = 1; i < n; i++ )
    {
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }

    for ( ll i = 1; i <= n; i++ )
    {
        DFS(i,i,0);
        fill(all(V),false);
    }

    cin >> q;
    ll t,x,l,r,a,b;
    while ( q-- )
    {
        cin >> t;
        if ( t == 1 )
        {
            cin >> a >> b;
            swap(P[a],P[b]);
            continue;
        }
        cin >> l >> r >> x;
        ll maxx = 0;
        for ( ll i = l; i <= r; i++ )
        {
            maxx = max( maxx, D[x][P[i]] );
        }
        cout << maxx << "\n";
    }

    return 0;
}