实在不会优化了,有没有巨佬告诉我还有哪里可以优化的
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
vector<int> child[MAXN];
int parent[MAXN];
int in[MAXN], out[MAXN], dfscnt = 0;
bool installed[MAXN];
bool vis[MAXN];
struct SegTree {
vector<int> sum, lazy;
int n;
void init(int nn) {
n = nn;
sum.resize(4 * n);
lazy.resize(4 * n, -1);
}
void pushdown(int p, int l, int r) {
if (lazy[p] == -1) return;
int m = (l + r) / 2;
sum[p * 2] = (m - l + 1) * lazy[p];
sum[p * 2 + 1] = (r - m) * lazy[p];
lazy[p * 2] = lazy[p * 2 + 1] = lazy[p];
lazy[p] = -1;
}
void update(int p, int l, int r, int ql, int qr, int val) {
if (qr < l || ql > r) return;
if (ql <= l && r <= qr) {
sum[p] = (r - l + 1) * val;
lazy[p] = val;
return;
}
pushdown(p, l, r);
int m = (l + r) / 2;
update(p * 2, l, m, ql, qr, val);
update(p * 2 + 1, m + 1, r, ql, qr, val);
sum[p] = sum[p * 2] + sum[p * 2 + 1];
}
int query(int p, int l, int r, int ql, int qr) {
if (qr < l || ql > r) return 0;
if (ql <= l && r <= qr) return sum[p];
pushdown(p, l, r);
int m = (l + r) / 2;
return query(p * 2, l, m, ql, qr) + query(p * 2 + 1, m + 1, r, ql, qr);
}
} st;
void dfs(int u) {
in[u] = ++dfscnt;
for (int v : child[u]) {
dfs(v);
}
out[u] = dfscnt;
}
void clear_mark(int x) {
queue<int> q;
q.push(x);
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = false;
for (int v : child[u]) {
q.push(v);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
st.init(n);
parent[0] = -1;
for (int i = 1; i < n; i++) {
cin >> parent[i];
child[parent[i]].push_back(i);
}
dfs(0);
int q;
cin >> q;
while (q--) {
string op;
int x;
cin >> op >> x;
if (op == "install") {
int cnt = 0;
vector<int> path;
while (x != -1 && !vis[x]) {
path.push_back(x);
vis[x] = true;
x = parent[x];
}
for (int node : path) {
if (st.query(1, 1, n, in[node], in[node]) == 0) {
cnt++;
st.update(1, 1, n, in[node], in[node], 1);
}
}
cout << cnt << '\n';
} else {
int cnt = st.query(1, 1, n, in[x], out[x]);
if (cnt > 0) {
st.update(1, 1, n, in[x], out[x], 0);
clear_mark(x);
}
cout << cnt << '\n';
}
}
return 0;
}