#include <iostream>
#include <limits.h>

using namespace std;

const int maxN = 5001;

int NajkraceRastojanje(int udaljenosti[maxN], bool naPutu[], int n)
{
    int min1 = INT_MAX, indexMin;
    for (int i = 1; i <= n; i++)
    {
        if (naPutu[i] == false && udaljenosti[i] <= min1)
        {
            min1 = udaljenosti[i];
            indexMin = i;
        }
    }
    return indexMin;
}

int main()
{
    int n, i, j, u, v, q, max1;
    int grupa, l, r, x, p;
    int gradovi[maxN], udaljenosti[maxN][maxN];
    bool matricaGrafa[maxN][maxN];
    cin >> n;
    for(i=1; i<=n; i++)
    {
        cin >> gradovi[i];
        for(j=1; j<=n; j++)
        {
            matricaGrafa[i][j] = 0;
        }
        udaljenosti[i][i]=-1;
    }
    for(i=1; i<=n-1; i++)
    {
        cin >> u;
        cin >> v;
        matricaGrafa[u][v] = 1;
        matricaGrafa[v][u] = 1;
    }
    cin >> q;
    while(q--)
    {
        cin >> grupa;
        if(grupa==1)
        {
            cin >> l;
            cin >> r;
            p = gradovi[l];
            gradovi[l] = gradovi[r];
            gradovi[r] = p;
        }
        else
        {
            cin >> l;
            cin >> r;
            cin >> x;
            if(udaljenosti[x][x]==-1)
            {
                bool naPutu[maxN];
                for (i = 1; i <= n; i++)
                {
                    udaljenosti[x][i] = INT_MAX;
                    naPutu[i] = false;
                }
                udaljenosti[x][x] = 0;
                for (i = 1; i <= n; i++)
                {
                    u = NajkraceRastojanje(udaljenosti[x], naPutu, n);
                    naPutu[u] = true;

                    for (v = 1; v <= n; v++)
                    {
                        if (!naPutu[v] && matricaGrafa[u][v] && udaljenosti[x][u] != INT_MAX && udaljenosti[x][u] + matricaGrafa[u][v] < udaljenosti[x][v])
                        {
                            udaljenosti[x][v] = udaljenosti[x][u] + matricaGrafa[u][v];
                        }
                    }
                }

                max1 = udaljenosti[x][l];
                for(i=l+1;i<=r;i++)
                {
                    if(udaljenosti[x][gradovi[i]]>max1)
                    {
                        max1 = udaljenosti[x][i];
                    }
                }
                cout << max1 << endl;

            }
            else
            {
                max1 = udaljenosti[x][l];
                for(i=l+1;i<=r;i++)
                {
                    if(udaljenosti[x][gradovi[i]]>max1)
                    {
                        max1 = udaljenosti[x][i];
                    }
                }
                cout << max1 << endl;
            }
        }
    }
}