#include <iostream>
#include <vector>

using namespace std;

class oznacavanje_naselja{
public:

};

class naselje{
public:
    int index_naselja;
    int broj_naselja;
    naselje* a;
    vector<unique_ptr<naselje>> povezana_naselja;
};

/*typedef struct{
    int index_naselja;
    int broj_naselja;
    vector<naselje> povezana_naselja;
    povezana_naselja.reserve(5);
}naselje;*/

int najdalja_putanja(naselje* a, int prethodni_broj_naselja, int min_interval, int max_invterval){
    int najdalje_naselje = 0;
    for(naselje* it : a->povezana_naselja){
        if(it->broj_naselja == prethodni_broj_naselja)
            continue;
        int b = najdalja_putanja(it, a->broj_naselja, min_interval, max_invterval);
        if(b > najdalje_naselje)
            najdalje_naselje = b;
    }
    if((a->index_naselja < min_interval || a->index_naselja > max_invterval)&&najdalje_naselje == 0)
        return 0;
    return 1 + najdalje_naselje;
}

int main()
{
    int n;
    cin>>n;
    naselje naselja[n];
    for(int i=0;i<n;i++){
        cin>>naselja[i].broj_naselja;
        naselja[i].index_naselja = i+1;
    }
    for(int i=0;i<n-1;i++){
        int a, b;
        cin>>a>>b;
        for(int i=0;i<n-1;i++){
            if(naselja[i].broj_naselja == a || naselja[i].broj_naselja == b){
                for(int j=i+1;j<n;j++){
                    if(naselja[j].broj_naselja == a || naselja[j].broj_naselja == b){
                        naselja[i].povezana_naselja.emplace_back(&naselja[j]);
                        naselja[j].povezana_naselja.emplace_back(&naselja[i]);
                        break;
                    }
                }
                break;
            }
        }
    }
    int q;
    cin>>q;
    for(int i=0;i<q;i++){
        int komanda;
        cin>>komanda;
        if(komanda == 1){
            int a, b;
            cin>>a>>b;
            for(int j=0;j<n-1;j++){
                if(naselja[j].broj_naselja == a || naselja[j].broj_naselja == b){
                    for(int k=j+1;k<n;k++){
                        if(naselja[k].broj_naselja == a || naselja[k].broj_naselja == b){
                            naselje pom = naselja[j];
                            naselja[j] = naselja[k];
                            naselja[k] = pom;
                            naselja[j].index_naselja = j + 1;
                            naselja[k].index_naselja = k + 1;
                            break;
                        }
                    }
                    break;
                }
            }
        }else{
            int a, b, c;
            cin>>a>>b>>c;
            for(int j=0;j<n;j++){
                if(naselja[j].broj_naselja == c){
                    int najdalja = 0;
                    for(auto& it : naselja[j].povezana_naselja){
                        cout<<"pre trazenja\n";
                        int najdalje_nadjeno = najdalja_putanja(it, naselja[j].broj_naselja, a, b);
                        if(najdalje_nadjeno > najdalja)
                            najdalja = najdalje_nadjeno;
                    }
                    cout<<najdalja<<"\n";
                    break;
                }
            }
        }
    }
    return 0;
}