#include <bits/stdc++.h>   using namespace std;   int p[200005], q[200005];   int fa[200005], top[200005], sz[200005], dep[200005];   vector<int> E[200005];   void dfs1(int root);   void dfs2(int root, int toproot);   int lca(int node1, int node2);   int dis(int node1, int node2);   pair<int, int> merge(int node1, int node2, int node3);   pair<int, int> merge(pair<int, int> path1, pair<int, int> path2);   void modify(int index, int lboundary, int rboundary, int position,               pair<int, int> path);   int query(int index, int lboundary, int rboundary, pair<int, int> path);   pair<int, int> tr[4 * 200005];   int main() {     int n;     scanf( %d , &n);     for (int i = 1; i <= n; i++) scanf( %d , p + i), q[p[i]] = i;     for (int i = 2; i <= n; i++) scanf( %d , fa + i);     for (int i = 2; i <= n; i++) {       E[i].push_back(fa[i]);       E[fa[i]].push_back(i);     }     dfs1(1);     dfs2(1, 1);     int k;     scanf( %d , &k);     for (int i = 1; i <= n; i++) {       modify(1, 0, n - 1, p[i], make_pair(q[p[i]], q[p[i]]));     }     while (k--) {       int t, u, v;       scanf( %d , &t);       if (t == 1) {         scanf( %d %d , &u, &v);         swap(p[u], p[v]);         swap(q[p[u]], q[p[v]]);         modify(1, 0, n - 1, p[u], make_pair(q[p[u]], q[p[u]]));         modify(1, 0, n - 1, p[v], make_pair(q[p[v]], q[p[v]]));       } else if (t == 2) {         if (tr[1].first)           cout << n << endl;         else           cout << query(1, 0, n - 1, make_pair(q[0], q[0])) << endl;       }     }   }   void dfs1(int r) {     sz[r] = 1;     for (int u : E[r])       if (u != fa[r]) {         dfs1(u);         sz[r] += sz[u];       }   }   void dfs2(int r, int t) {     top[r] = t;     dep[r] = dep[fa[r]] + 1;     int tid = -1, msz = 0;     for (int u : E[r])       if (u != fa[r] && sz[u] > msz) {         msz = sz[u];         tid = u;       }     if (tid == -1) return;     dfs2(tid, t);     for (int u : E[r])       if (u != fa[r] && u != tid) dfs2(u, u);   }   int lca(int a, int b) {     while (top[a] != top[b]) {       if (dep[top[a]] < dep[top[b]]) swap(a, b);       a = fa[top[a]];     }     return dep[a] < dep[b] ? a : b;   }   int dis(int a, int b) { return dep[a] + dep[b] - 2 * dep[lca(a, b)]; }   pair<int, int> merge(int a, int b, int c) {     int ab = dis(a, b), ac = dis(a, c), bc = dis(b, c);     if (ab == bc + ac)       return make_pair(a, b);     else if (ac == ab + bc)       return make_pair(a, c);     else if (bc == ab + ac)       return make_pair(b, c);     else       return make_pair(0, 0);   }   pair<int, int> merge(pair<int, int> a, pair<int, int> b) {     if (!a.first || !b.first) return make_pair(0, 0);     pair<int, int> tmp = merge(a.first, a.second, b.first);     if (tmp.first) tmp = merge(tmp.first, tmp.second, b.second);     return tmp;   }   void modify(int o, int l, int r, int p, pair<int, int> v) {     if (l == r) {       tr[o] = v;       return;     }     int mid = (l + r) >> 1;     if (p <= mid)       modify((o << 1), l, mid, p, v);     else       modify((o << 1 | 1), mid + 1, r, p, v);     tr[o] = merge(tr[(o << 1)], tr[(o << 1 | 1)]);   }   int query(int o, int l, int r, pair<int, int> p) {     if (l == r) return l;     int mid = (l + r) >> 1;     pair<int, int> q = merge(p, tr[(o << 1)]);     if (!q.first)       return query((o << 1), l, mid, p);     else       return query((o << 1 | 1), mid + 1, r, q);   }