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

namespace ConsoleApplication1
{
    class Program
    {
        public static List<int> trazeni;
        public static int max; 
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            Hashtable ht = new Hashtable(); 

            string[] s = Console.ReadLine().Split();
            Cvor[] p = new Cvor[N];

            for (int i = 0; i < N; i++)
            {
                p[i] = new Cvor(int.Parse(s[i]));
                ht.Add(p[i].broj, i); //key je vrednost cvora, tj. njihov br, a value  je index u nizu
            }

            for (int i = 0; i < N-1; i++)
            {
                s = Console.ReadLine().Split();
                p[(int)ht[int.Parse(s[0])]].Dodaj(p[(int)ht[int.Parse(s[1])]]);
            }

            int Q = int.Parse(Console.ReadLine());
            string izlaz = "";
            for (int i = 0; i < Q; i++)
            {
                s = Console.ReadLine().Split();
                if (s[0] == "1")
                {
                    int a = int.Parse(s[1]);
                    int b = int.Parse(s[2]);
                    Cvor c = p[a - 1];
                    p[a - 1] = p[b - 1];
                    p[b - 1] = c;
                }

                if (s[0] == "2")
                {
                    max = -1;
                    trazeni = new List<int>();
                    for (int j = int.Parse(s[1]); j <= int.Parse(s[2]); j++)
                        trazeni.Add(p[j-1].broj);

                    foreach (Cvor c in p)
                        c.proveren = false;

                    p[(int)ht[int.Parse(s[3])]].Razdaljina(0);
                    izlaz += (max + "\n");
                    max = -1;
                }
            }
            Console.WriteLine(izlaz);
            Console.Read();

        }
    }

    class Cvor {
        public int broj;
        public List<Cvor> povezaniCvorovi;
        public bool proveren;

        public Cvor(int i)
        {
            this.broj = i;
            povezaniCvorovi = new List<Cvor>();
            proveren = false;
        }

        public void Dodaj(int i)
        {
            povezaniCvorovi.Add(new Cvor(i));
            povezaniCvorovi[povezaniCvorovi.Count].povezaniCvorovi.Add(this);
            povezaniCvorovi.Capacity++;
        }

        public void Dodaj(Cvor c)
        {
            povezaniCvorovi.Add(c);
            povezaniCvorovi[povezaniCvorovi.Count-1].povezaniCvorovi.Add(this);
            povezaniCvorovi.Capacity++;
        }

        public void Razdaljina(int n)
        {
            this.proveren = true;
            if (Program.trazeni.Contains(this.broj))
            {
                if (Program.max < n)
                    Program.max = n;

                Program.trazeni.Remove(this.broj);
                if (Program.trazeni.Count == 0)
                    return;
            }

            foreach (Cvor c in povezaniCvorovi)
            {
                if(!c.proveren)
                    c.Razdaljina(n + 1);
            }
        }
    }
}