实在不会优化了,有没有巨佬告诉我还有哪里可以优化的
#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;
bool installed[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;
}
int install(int x) {
int cnt = 0;
while(true) {
if(st.query(1, 1, st.n, in[x], in[x]) == 0) {
cnt++;
st.update(1, 1, st.n, in[x], in[x], 1);
}
if(x == 0) break;
x = parent[x];
}
return cnt;
}
int uninstall(int x) {
int cnt = st.query(1, 1, st.n, in[x], out[x]);
if(cnt > 0) {
st.update(1, 1, st.n, in[x], out[x], 0);
}
return cnt;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
st.init(n);
for(int i = 1; i < n; i++) {
cin >> parent[i];
child[parent[i]].push_back(i);
}
dfscnt = 0;
dfs(0);
int q;
cin >> q;
while(q--) {
string op;
int x;
cin >> op >> x;
if(op == "install") {
cout << install(x) << '\n';
} else {
cout << uninstall(x) << '\n';
}
}
return 0;
}