fork(1) 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 "stalingrad"
  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. {
  69. rf();
  70. int theta;
  71. if(!(cin>>theta)) return 0;
  72. int n,q; cin>>n>>q;
  73. vector<int> par(n+1,0);
  74. vector<vector<int>> child(n+1);
  75. par[1]=0;
  76. for(int i=2;i<=n;i++){cin>>par[i]; child[par[i]].push_back(i);}
  77. vector<int> sz(n+1,1);
  78. vector<int> order; order.reserve(n);
  79. order.push_back(1);
  80. for(size_t i=0;i<order.size();i++) for(int u:child[order[i]]) order.push_back(u);
  81. for(int i=n-1;i>=0;i--){int v=order[i]; for(int u:child[v]) sz[v]+=sz[u];}
  82. vector<char> occ(n+1,0);
  83. vector<int> occChildCnt(n+1,0);
  84. vector<long long> sumSzOccChild(n+1,0);
  85. long long cntS=0,E=0,sumTopSz=0;
  86. while(q--){
  87. char c; int v; cin>>c>>v;
  88. if(c=='+'){
  89. occ[v]=1; cntS++;
  90. if(par[v] && occ[par[v]]) E++;
  91. E += occChildCnt[v];
  92. if(!(par[v] && occ[par[v]])) sumTopSz += sz[v];
  93. sumTopSz -= sumSzOccChild[v];
  94. if(par[v]){
  95. occChildCnt[par[v]]++;
  96. sumSzOccChild[par[v]] += sz[v];
  97. }
  98. }else{
  99. if(!(par[v] && occ[par[v]])) sumTopSz -= sz[v];
  100. sumTopSz += sumSzOccChild[v];
  101. if(par[v] && occ[par[v]]) E--;
  102. E -= occChildCnt[v];
  103. if(par[v]){
  104. occChildCnt[par[v]]--;
  105. sumSzOccChild[par[v]] -= sz[v];
  106. }
  107. occ[v]=0; cntS--;
  108. }
  109. long long cuts = cntS - E;
  110. long long iso = sumTopSz - cntS;
  111. cout<<cuts<<" "<<iso<<"\n";
  112. }
  113. return 0;
  114. }
  115.  
Success #stdin #stdout 0.01s 5292KB
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