两个样例全过,第一个数据点读入都读入不了,请问是哪里写挂了?
#include <bits/stdc++.h>
using namespace std;
#define inf 1000000000000000
#define V 2000010
#define E 10000010
typedef long long int ll;
struct edge {
public:
int to, next;
};
int cnt = 0, head[V], son[V], fa[V], siz[V], dep[V], top[V], dfn[V], id[V], dct = 0, n, m, r; edge node[E]; ll w[V];
inline void add(int fir, int nxt) {
node[cnt].to = nxt,
node[cnt].next = head[fir],
head[fir] = cnt++;
}
struct segtree {
public:
struct ment {
public:
int l, r;
ll sum, tage;
ment() { l = 0, r = 0, sum = 0, tage = -1; }
};
vector<ment>tree;
void build(int l, int r, int i = 1);
ll query(int l, int r, int i = 1);
void pushdown(int i);
void pushup(int i);
void modfiy(int l, int r, ll k, int i = 1);
};
void segtree::build(int l, int r, int i) {
tree[i].l = l, tree[i].r = r;
if (l == r)return;
int mid = (l + r) >> 1;
build(l, mid, i << 1); build(mid + 1, r, (i << 1) | 1);
}
void segtree::pushdown(int i) {
if (tree[i].tage != -1) {
if (tree[i].l == tree[i].r) { tree[i].tage = 0; return; }
tree[i << 1].tage = tree[(i << 1) | 1].tage = tree[i].tage;
tree[i << 1].sum = (tree[i << 1].r - tree[i << 1].l + 1) * tree[i].tage;
tree[(i << 1) | 1].sum = (tree[(i << 1) | 1].r - tree[(i << 1) | 1].l + 1) * tree[i].tage;
tree[i].tage = -1;
}
}
inline void segtree::pushup(int i) { tree[i].sum = tree[i << 1].sum + tree[(i << 1) | 1].sum; }
ll segtree::query(int l, int r, int i) {
pushdown(i); ll sum = 0;
if (tree[i].l >= l && tree[i].r <= r)return tree[i].sum;
if (tree[i << 1].r >= l)sum += query(l, r, i << 1);
if (tree[(i << 1) | 1].l <= r)sum += query(l, r, (i << 1) | 1);
return sum;
}
void segtree::modfiy(int l, int r, ll k, int i) {
pushdown(i);
if (tree[i].l >= l && tree[i].r <= r) {
tree[i].sum = (tree[i].r - tree[i].l + 1) * k;
tree[i].tage = k; return;
}
if (tree[i << 1].r >= l) modfiy(l, r, k, i << 1);
if (tree[(i << 1) | 1].l <= r) modfiy(l, r, k, (i << 1) | 1);
pushup(i);
}
void dfs1(int v = r, int f = 0) {
if (v == r)dep[v] = 0, fa[v] = 0, siz[v] = 1;
else fa[v] = f, siz[v] = 1, dep[v] = dep[f] + 1;
int u, msiz = -1, mson = -1;
for (register int i = head[v]; i != -1; i = node[i].next) {
u = node[i].to;
if (u == fa[v])continue;
dfs1(u, v);
if (siz[u] > msiz)msiz = siz[u], mson = u;
siz[v] += siz[u];
}
son[v] = mson;
}
void dfs2(int v = r, int t = r) {
dfn[v] = ++dct; top[v] = t; id[dfn[v]] = v;
if (son[v] == -1)return;
dfs2(son[v], t); int u;
for (register int i = head[v]; i != -1; i = node[i].next) {
u = node[i].to;
if (u == son[v] || u == fa[v])continue;
dfs2(u, u);
}
}
segtree stree;
inline void init() {
dep[0] = -1;
top[r] = r;
stree.tree.resize(n * 4);
}
inline ll quepath(int x, int y) {
ll sum = 0;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])swap(x, y);
sum += dfn[x] - dfn[top[x]] - stree.query(dfn[top[x]], dfn[x]);
if (dfn[x] == dfn[top[x]])++sum;
stree.modfiy(dfn[top[x]], dfn[x], 1);
x = fa[top[x]];
}
if (dep[x] > dep[y])swap(x, y);
sum += dfn[y] - dfn[x] - stree.query(dfn[x], dfn[y]) + 1;
stree.modfiy(dfn[x], dfn[y], 1);
return sum;
}
inline ll quetree(int x) {
ll sum = stree.query(dfn[x], dfn[x] + siz[x] - 1);
stree.modfiy(dfn[x], dfn[x] + siz[x] - 1, 0);
return sum;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(); cout.tie();
memset(head, -1, V * sizeof(int));
cin >> n; r = 1; int x; ll z; string a;
for (int i = 1; i < n; i++) {
cin >> x; add(x+1, i+1); add(i+1, x+1);
}
cin >> m;
init(), dfs1(), dfs2(); stree.build(1, n);
while(m--){
cin >> a >> x;
if (a == "install")cout << quepath(r, x+1) << endl;
else cout << quetree(x+1) << endl;
}
return 0;
}