Skip to content
c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
int n, q;
std::vector<int> g[N];
int dep[N], fa[N], top[N], sz[N], son[N], dfn[N], seg[N], timer;
int tree[N << 2], lazy[N << 2];
void dfs1(int u, int f) {
    dep[u] = dep[f] + 1, son[u] = 0, sz[u] = 1, fa[u] = f;
    for (int v : g[u]) {
        if (v != f) {
            dfs1(v, u);
            sz[u] += sz[v];
            if (sz[v] > sz[son[u]]) son[u] = v;
        }
    }
}
void dfs2(int u, int tp) {
    top[u] = tp, dfn[u] = ++timer, seg[timer] = u;
    if (son[u]) dfs2(son[u], tp);
    for (int v : g[u]) {
        if (v == fa[u] || v == son[u]) continue;
        dfs2(v, v);
    }
}
inline void pushup(int p) { tree[p] = tree[p << 1] + tree[p << 1 | 1]; }
inline void pushdown(int p, int l, int r) {
    if (-1 == lazy[p]) return;
    int mid = (l + r) >> 1;
    int ls = p << 1, rs = p << 1 | 1;
    tree[ls] = lazy[p] * (mid - l + 1);
    lazy[ls] = lazy[p];

    tree[rs] = lazy[p] * (r - mid);
    lazy[rs] = lazy[p];

    lazy[p] = -1;
}
int query(int p, int l, int r, int ql, int qr, int val,bool pre) {
    int res = 0;
    if (ql <= l && r <= qr) {
        res = tree[p];
        tree[p] = val * (r - l + 1);
        lazy[p] = val;
        return (pre?res:tree[p]-res);
    }
    pushdown(p, l, r);
    int mid = (l + r) >> 1;
    if (ql <= mid) res += query(p << 1, l, mid, ql, qr, val,pre);
    if (qr > mid) res += query(p << 1 | 1, mid + 1, r, ql, qr, val,pre);
    pushup(p);
    return res;
}
int path_query(int u, int v) {
    int res = 0;
    while (top[u] != top[v]) {
        if (dep[top[u]] < dep[top[v]]) std::swap(u, v);
        res += query(1, 1, n, dfn[top[u]], dfn[u], 1,false);
        u = fa[top[u]];
    }
    if (dep[u] < dep[v]) std::swap(u, v);
    return res + query(1, 1, n, dfn[v], dfn[u], 1,false);
}
void fc() {
    std::cin >> n;
    memset(lazy, -1, sizeof(lazy));
    for (int i = 2; i <= n; i++) {
        int v;
        std::cin >> v;
        ++v;
        g[i].push_back(v);
        g[v].push_back(i);
    }
    dfs1(1, 0);
    dfs2(1, 1);

    std::cin >> q;
    while (q--) {
        std::string s;
        int x;
        std::cin >> s >> x;
        ++x;
        if (s[0] == 'i') {
            std::cout << path_query(1, x) << "\n";
        } else {
            std::cout << query(1, 1, n, dfn[x], dfn[x] + sz[x] - 1, 0,true) << "\n";
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    // std::cin>>t;
    while (t--) fc();
    return 0;
}