Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 100 * 1000 + 10;
  6. const int H = 22;
  7.  
  8. int go[N][H];
  9. int tin[N];
  10. int tout[N];
  11. int col[N];
  12. int size[N];
  13. vector<int> g[N];
  14. int timer;
  15.  
  16. void dfs(int v, int c, int par) {
  17.     if (g[v].size() == 0)
  18.         size[v] = 1;
  19.     go[v][0] = par;
  20.     for (int h = 1; h < H; h++)
  21.         go[v][h] = go[go[v][h - 1]][h - 1];
  22.     tin[v] = timer++;
  23.     col[v] = c;
  24.     for (int to : g[v]) {
  25.        dfs(to, c, v);
  26.        size[v] += size[to];
  27.     }
  28.     tout[v] = timer++;
  29. }
  30.  
  31. bool isAnc(int a, int b) {
  32.     return tin[a] <= tin[b] && tin[b] <= tout[a];
  33. }
  34.  
  35. int lca(int a, int b) {
  36.     if (isAnc(a, b))
  37.         return a;
  38.     if (isAnc(b, a))
  39.         return b;
  40.     for (int h = H - 1; h >= 0; h--)
  41.         if (!isAnc(go[a][h], b))
  42.             a = go[a][h];
  43.     return go[a][0];
  44. }
  45.  
  46. typedef pair<int, int> pii;
  47.  
  48. set<pii> at[N];
  49. int pipes[N];
  50. int people[N];
  51. int totPipes;
  52. int totPeople;
  53.  
  54. void check(set<pii>& s, int& pipesAt, int& peopleAt) {
  55.     if (s.size() == 0) {
  56.         pipesAt = 0;
  57.         peopleAt = 0;
  58.         return;
  59.     }
  60.     auto it = s.begin();
  61.     int fst = it->second;
  62.     it = s.end();
  63.     it--;
  64.     int snd = it->second;
  65.     int root = lca(fst, snd);
  66.     pipesAt = 1;
  67.     peopleAt = size[root] - s.size();
  68. }
  69.  
  70. void add(int v, set<pii>& s, int& pipesAt, int& peopleAt) {
  71.     totPipes -= pipesAt;
  72.     totPeople -= peopleAt;
  73.     s.insert(pii(tin[v], v));
  74.     check(s, pipesAt, peopleAt);
  75.     totPipes += pipesAt;
  76.     totPeople += peopleAt;
  77. }
  78.  
  79. void del(int v, set<pii>& s, int& pipesAt, int& peopleAt) {
  80.     totPipes -= pipesAt;
  81.     totPeople -= peopleAt;
  82.     s.erase(pii(tin[v], v));
  83.     check(s, pipesAt, peopleAt);
  84.     totPipes += pipesAt;
  85.     totPeople += peopleAt;
  86. }
  87.  
  88. int main() {
  89.     freopen("gangsters.in", "r", stdin);
  90.     freopen("gangsters.out", "w", stdout);
  91.     int n, q;
  92.     scanf("%d%d", &n, &q);
  93.     for (int i = 1; i < n; i++) {
  94.         int p;
  95.         scanf("%d", &p);
  96.         p--;
  97.         g[p].push_back(i);
  98.     }
  99.     for (int to : g[0])
  100.         dfs(to, to, 0);
  101.     for (int i = 0; i < q; i++) {
  102.         char s[10];
  103.         int v;
  104.         scanf("%s%d", s, &v);
  105.         if (s[0] == '+')
  106.             add(v, at[col[v]], pipes[col[v]], people[col[v]]);
  107.         else
  108.             del(v, at[col[v]], pipes[col[v]], people[col[v]]);
  109.         printf("%d %d\n", totPipes, totPeople);
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement