using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication131
{
    class Program
    {
        static void zameni_poz(int[] poz, int a, int b)
        {
            int t = poz[a];
            poz[a] = poz[b];
            poz[b] = t;
        }
        static int ras(List<int>[] put, int p, int k, ref bool[] posecen)
        {
            if (posecen[p]) return -1;
            if (put[p].Contains(k))
            {
                posecen[p] = true;
                return 1;
            }
            posecen[p] = true;
            int min = ras(put, put[p][0], k, ref posecen) + 1;
            for (int i = 0; i < put[p].Count - 1; i++)
            {
                int ss = ras(put, put[p][1], k, ref posecen) + 1;
                if (ss != -1)
                {
                    if (ss < min)
                    {
                        min = ss;
                    }
                }
            }
            return min;
        }
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            string[] str = Console.ReadLine().Split();
            int[] poz = new int[n + 1];
            poz[0] = 0;
            List<int>[] put = new List<int>[n + 1];
            put[0] = new List<int>();
            for (int i = 1; i <= n; i++)
            {
                poz[int.Parse(str[i - 1])] = i;
                put[i] = new List<int>();
            }
            for (int i = 0; i < n - 1; i++) 
            {
                str = Console.ReadLine().Split();
                put[poz[int.Parse(str[0])]].Add(poz[int.Parse(str[1])]);
                put[poz[int.Parse(str[1])]].Add(poz[int.Parse(str[0])]);
            }
            int q = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                string[] str1 = Console.ReadLine().Split();
                if(str1[0] == "1")
                {
                    zameni_poz(poz, int.Parse(str1[1]), int.Parse(str1[2]));
                }
                else
                {
                    int l = int.Parse(str1[1]);
                    int r = int.Parse(str1[2]);
                    int x = poz[int.Parse(str1[3])];
                    bool[] posecen = new bool[n+1];
                    for(int j = 0; j<n+1; j++)
                    {
                        posecen[j] = false;
                    }
                    int max = ras(put, x, l, ref posecen);
                    for (int j = l + 1; j <= r; j++)
                    {
                        max = Math.Max(max, ras(put, x, j, ref posecen));
                    }
                    Console.WriteLine(max);
                }
            }
        }
    }
}