Advertisement
K_Y_M_bl_C

Untitled

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