1、Apple Tree
点击查看代码
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int N = 2e5 + 10;
int cnt, head[N];
struct node
{
int to, nex;
} e[N << 1];
void add_edge(int u, int v)
{
e[++cnt].to = v;
e[cnt].nex = head[u];
head[u] = cnt;
}
int n, m, in[N], out[N], vis[N], idx, c[N];
void dfs(int u)
{
//cout << u << "\n";
in[u] = ++idx;
for(int i = head[u]; i != -1; i = e[i].nex)
{
dfs(e[i].to);
}
out[u] = idx;
}
int lowbit(int x)
{
return x & -x;
}
void change(int i, int k)
{
for(; i <= n; i += lowbit(i)) c[i] += k;
}
int query(int i)
{
int ans = 0;
for(; i; i -= lowbit(i)) ans += c[i];
return ans;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0);
memset(head, -1, sizeof head);
cin >> n;
int u, v;
for(int i = 1; i < n; ++i)
{
cin >> u >> v;
add_edge(u, v);
}
dfs(1);
for(int i = 1; i <= n; ++i) change(in[i], 1);
cin >> m;
string op;
while(m-- && cin >> op >> u)
{
if(op == "Q")
{
cout << query(out[u]) - query(in[u] - 1) << "\n";
}
else
{
if(vis[u] == 0)
{
vis[u] = 1;
change(in[u], -1);
}
else
{
vis[u] = 0;
change(in[u], 1);
}
}
}
return 0;
}