Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- using ll = long long;
- const ll DIM = 1e5+1;
- vector < ll > g[DIM];
- ll timer, tin[DIM], tout[DIM], rnk[DIM], mod[4*DIM];
- void dfs(ll v, ll p){
- tin[v] = ++timer;
- rnk[tin[v]] = rnk[tin[p]] + 1;
- for (ll to: g[v]){
- if (to != p) dfs(to, v);
- }
- tout[v] = timer;
- }
- #define ver1 v*2+1
- #define ver2 ver1+1
- #define tm ((tl+tr)>>1)
- void push(ll v, ll tl, ll tr){
- if (tl == tr || mod[v] == 0) return;
- mod[ver1] += mod[v];
- mod[ver2] += mod[v];
- mod[v] = 0;
- }
- void change(ll v, ll tl, ll tr, ll l, ll r, ll val){
- if (l > r) return;
- if (tl > r || tr < l) return;
- if (tl >= l && tr <= r) mod[v] += val;
- else{
- push(v, tl, tr);
- change(ver1, tl, tm, l, r, val);
- change(ver2, tm+1, tr, l, r, val);
- }
- }
- ll get_rank(ll v, ll tl, ll tr, ll pos){
- if (tl == tr) return rnk[tl] + mod[v];
- push(v, tl, tr);
- if (pos <= tm) return get_rank(ver1, tl, tm, pos);
- else return get_rank(ver2, tm+1, tr, pos);
- }
- int main(){
- ll n;
- cin >> n;
- for (ll i=2; i<=n; i++){
- ll v;
- cin >> v;
- g[v].push_back(i);
- }
- rnk[1] = -1;
- dfs(1, 1);
- ll is_dead[n+1];
- fill(is_dead, is_dead+n+1, 0);
- ll q;
- cin >> q;
- while(q --){
- ll t, x;
- cin >> t >> x;
- if (t == 1){
- if (is_dead[x] == 0){
- change(0, 1, timer, tin[x]+1, tout[x], -1);
- is_dead[x] = 1;
- }
- }else{
- if (t == 2){
- if (is_dead[x] == 1){
- change(0, 1, timer, tin[x]+1, tout[x], 1);
- is_dead[x] = 0;
- }
- }else{
- cout << get_rank(0, 1, timer, tin[x]) << '\n';
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment