fork download
  1. //#pragma GCC optimize("Ofast,unroll-loops")
  2. //#pragma GCC target("avx2,tune=native")
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. #define file "o"
  7. #define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
  8. #define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
  9. #define nl "\n"
  10. #define ss " "
  11. //#define pb push_back
  12. #define pb emplace_back
  13. #define fi first
  14. #define se second
  15. #define all(s) (s).begin(), (s).end()
  16. #define ms(a,x) memset(a, x, sizeof (a))
  17. #define cn continue
  18. #define re exit(0)
  19.  
  20. typedef long long ll;
  21. typedef unsigned long long ull;
  22. typedef long double ld;
  23. typedef vector<int> vi;
  24. typedef vector<ll> vll;
  25. typedef pair<int, int> pii;
  26. typedef pair<ll, ll> pll;
  27. typedef vector<pii> vpii;
  28. typedef vector<pll> vpll;
  29.  
  30. const int mod=1e9+7;
  31. const int maxn=1e6+15;
  32. const ll inf=1e17;
  33.  
  34. mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
  35. ll ran(ll l, ll r)
  36. {
  37. return uniform_int_distribution<ll> (l, r)(rng);
  38. }
  39.  
  40. inline void rf(){
  41. ios_base::sync_with_stdio(false);
  42. cin.tie(nullptr); cout.tie(nullptr);
  43. if(fopen(file".inp","r")){
  44. freopen(file".inp","r",stdin); freopen(file".out","w",stdout);
  45. }
  46. }
  47.  
  48. template<typename T> inline void add(T &x, const T &y)
  49. {
  50. x+=y;
  51. if(x>=mod) x-=mod;
  52. if(x<0) x+=mod;
  53. }
  54.  
  55. template<typename T> inline bool maxi(T &a, T b)
  56. {
  57. if(a>=b) return 0;
  58. a=b; return 1;
  59. }
  60.  
  61. template<typename T> inline bool mini(T &a, T b)
  62. {
  63. if(a<=b) return 0;
  64. a=b; return 1;
  65. }
  66.  
  67. int main(){
  68. rf();
  69. int T; cin>>T;
  70. int n,q; cin>>n>>q;
  71. vector<int> p(n+1);
  72. p[1]=0;
  73. for(int i=2;i<=n;i++) cin>>p[i];
  74. vector<vector<int>> ch(n+1);
  75. for(int i=2;i<=n;i++) ch[p[i]].push_back(i);
  76. vector<int> order;
  77. order.reserve(n);
  78. order.push_back(1);
  79. for(size_t i=0;i<order.size();i++){
  80. int u=order[i];
  81. for(int v:ch[u]) order.push_back(v);
  82. }
  83. vector<int> sz(n+1,1);
  84. for(int i=n-1;i>=0;i--){
  85. int u=order[i];
  86. for(int v:ch[u]) sz[u]+=sz[v];
  87. }
  88. vector<char> act(n+1,0);
  89. vector<int> active_child_cnt(n+1,0);
  90. vector<ll> sum_sz_active_children(n+1,0);
  91. ll active_count=0;
  92. ll edges_active=0;
  93. ll total_sz_sum=0;
  94. while(q--){
  95. char op;
  96. int v;
  97. cin>>op>>v;
  98. if(op=='+'){
  99. act[v]=1;
  100. active_count++;
  101. active_child_cnt[p[v]]++;
  102. sum_sz_active_children[p[v]] += sz[v];
  103. if(act[p[v]]) edges_active++;
  104. edges_active += active_child_cnt[v];
  105. if(!act[p[v]]) total_sz_sum += sz[v];
  106. total_sz_sum -= sum_sz_active_children[v];
  107. } else {
  108. act[v]=0;
  109. active_count--;
  110. active_child_cnt[p[v]]--;
  111. sum_sz_active_children[p[v]] -= sz[v];
  112. if(act[p[v]]) edges_active--;
  113. edges_active -= active_child_cnt[v];
  114. if(!act[p[v]]) total_sz_sum -= sz[v];
  115. total_sz_sum += sum_sz_active_children[v];
  116. }
  117. ll comp = active_count - edges_active;
  118. ll isolated = total_sz_sum - active_count;
  119. cout<<comp<<" "<<isolated<<"\n";
  120. }
  121. return 0;
  122. }
Success #stdin #stdout 0.01s 5320KB
stdin
3
10 5
1 2 2 2 1 6 7 7 6
+ 9
+ 7
+ 2
- 9
- 7
stdout
1 0
1 1
2 4
2 5
1 3