Advertisement
K_Y_M_bl_C

Untitled

Mar 16th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. const int MAXN = (int)3e5 + 7;
  2. const int INF = (int)1e9 + 7;
  3. const ll LINF = (ll)6e18 + 7;
  4.  
  5. int n, k, ans, vl;
  6. map <pii, vpii> q;
  7. vpii t[4 * MAXN];
  8. int tim, pos;
  9. map<int, int> qrs;
  10. int r[MAXN], p[MAXN];
  11. vpii sp, sr;
  12.  
  13. int L, R;
  14. pii val;
  15.  
  16. void update_edge(int v, int tl, int tr)
  17. {
  18.     if (tl > R || tr < L)
  19.         return;
  20.     if (L <= tl && tr <= R)
  21.     {
  22.         t[v].inb(val);
  23.         return;
  24.     }
  25.     int tm = tl + tr >> 1;
  26.     if (tm >= L)
  27.         update_edge(2 * v + 1, tl, tm);
  28.     if (tm + 1 <= R)
  29.         update_edge(2 * v + 2, tm + 1, tr);
  30. }
  31.  
  32. int dsu_get(int x)
  33. {
  34.     if (p[x] == x)
  35.         return x;
  36.     return dsu_get(p[x]);
  37. }
  38.  
  39. int dsu_unit(int a, int b)
  40. {
  41.     a = dsu_get(a);
  42.     b = dsu_get(b);
  43.     if (a != b)
  44.     {
  45.         --ans;
  46.         if (r[a] < r[b])
  47.             swap(a, b);
  48.         sr.inb(mk(a, r[a]));
  49.         sp.inb(mk(b, p[b]));
  50.         r[a] += r[b];
  51.         p[b] = a;
  52.         return 1;
  53.     }
  54.     return 0;
  55. }
  56.  
  57. void dsu_back()
  58. {
  59.     r[sr.back().X] = sr.back().Y;
  60.     p[sp.back().X] = sp.back().Y;
  61.     ++ans;
  62.     sr.outb(), sp.outb();
  63. }
  64.  
  65. void dfs(int v, int tl, int tr)
  66. {
  67.     int cnt = 0;
  68.     for (auto &edge : t[v])
  69.         cnt += dsu_unit(edge.X, edge.Y);
  70.     if (tl != tr)
  71.     {
  72.         int tm = tl + tr >> 1;
  73.         dfs(2 * v + 1, tl, tm);
  74.         dfs(2 * v + 2, tm + 1, tr);
  75.     }
  76.     else
  77.     {
  78.         for (int i = 0; i < qrs[tl]; ++i)
  79.             printf("%d\n", ans);
  80.     }
  81.     for (int i = 0; i < cnt; ++i)
  82.         dsu_back();
  83. }
  84.  
  85. int solve()
  86. {
  87.     scanf("%d %d", &n, &k);
  88.     ans = n;
  89.     for (int i = 0; i < n; ++i)
  90.         p[i] = i;
  91.     for (int i = 0; i < k; ++i)
  92.     {
  93.         char cmd;
  94.         scanf(" %c", &cmd);
  95.         if (cmd == '?')
  96.         {
  97.             if (tim == 0)
  98.                 printf("%d\n", ans);
  99.             else
  100.                 ++qrs[tim];
  101.         }
  102.         else
  103.         {
  104.             int a, b;
  105.             scanf("%d %d", &a, &b);
  106.             --a, --b;
  107.             if (a > b)
  108.                 swap(a, b);
  109.             if (cmd == '+')
  110.             {
  111.                 q[mk(a, b)].inb(mk(tim, -1));
  112.             }
  113.             else
  114.             {
  115.                 q[mk(a, b)].back().Y = tim;
  116.             }
  117.         }
  118.         ++tim;
  119.     }
  120.     for (auto &Q : q)
  121.     {
  122.         val = Q.X;
  123.         for (auto &lr : Q.Y)
  124.         {
  125.             L = lr.X;
  126.             R = lr.Y;
  127.             if (R == -1)
  128.                 R = tim;
  129.             update_edge(0, 0, tim);
  130.         }
  131.     }
  132.     dfs(0, 0, tim);
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement