Advertisement
SorahISA

TIOJ 1903

Jul 28th, 2020 (edited)
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. // #pragma GCC target("avx2")
  2. #pragma GCC optimize("O3", "unroll-loops")
  3.  
  4. // #include <bits/extc++.h>
  5. // using namespace __gnu_pbds;
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9.  
  10. // #define int long long
  11. #define double long double
  12. // template <typename T>
  13. // using pbds_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  14. using pii = pair<int, int>;
  15. template<typename T>
  16. using prior = priority_queue<T, vector<T>, greater<T>>;
  17. template<typename T>
  18. using Prior = priority_queue<T>;
  19.  
  20. #define X first
  21. #define Y second
  22. #define ALL(x) (x).begin(), (x).end()
  23. #define eb emplace_back
  24. #define pb push_back
  25.  
  26. #define fastIO() ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  27. #define RANDOM() random_device __rd; \
  28.                  mt19937 __gen = mt19937(__rd()); \
  29.                  uniform_int_distribution<int> __dis(1, 1E8); \
  30.                  auto rnd = bind(__dis, __gen)
  31.  
  32. #define ls(x) ((x) << 1)
  33. #define rs(x) ((x) << 1 | 1)
  34.  
  35. struct Event {
  36.     int u, v, sv;
  37.     /// merge (u, v) ///
  38. };
  39.  
  40. const int INF = 0x7f7f7f7f;
  41. const int mod = 1E9 + 7;
  42. const int maxn = 1 << 19;
  43.  
  44. int cc_cnt;
  45. int par[maxn], sz[maxn];
  46. stack<Event> stk;
  47. vector<pii> event[maxn << 1];
  48.  
  49. int Root(int x) {
  50.     while (x ^ par[x]) x = par[x];
  51.     return x;
  52. }
  53.  
  54. void Union(int x, int y) {
  55.     x = Root(x), y = Root(y);
  56.     // if (x == y) {stk.push({-1, -1, -1}); return;}
  57.     if (sz[x] > sz[y]) swap(x, y);
  58.    
  59.     stk.push({x, y, sz[y]}), --cc_cnt;
  60.     par[x] = y, sz[y] += sz[x];
  61. }
  62.  
  63. void Undo() {
  64.     Event ev = stk.top(); stk.pop();
  65.     // if (ev.u == -1) return;
  66.    
  67.     par[ev.u] = ev.u, ++cc_cnt;
  68.     sz[ev.v] = ev.sv;
  69. }
  70.  
  71. void AddEvent(int qL, int qR, pii ev, int id = 1, int nL = 0, int nR = maxn-1) {
  72.     if (qL <= nL and nR <= qR) {event[id].eb(ev); return;}
  73.     // if (qR < nL or nR < qL) return;
  74.    
  75.     int mi = nL + nR >> 1;
  76.     if (qL <= mi) AddEvent(qL, qR, ev, ls(id), nL,     mi);
  77.     if (qR >  mi) AddEvent(qL, qR, ev, rs(id), mi + 1, nR);
  78. }
  79.  
  80. void Traversal(int q, int id = 1, int nL = 0, int nR = maxn-1) {
  81.     if (nL > q) return;
  82.    
  83.     int cnt = 0;
  84.     for (auto ev : event[id]) {
  85.         if (Root(ev.X) != Root(ev.Y)) Union(ev.X, ev.Y), ++cnt;
  86.     }
  87.    
  88.     if (nL == nR) {
  89.         if (nL != 0) cout << cc_cnt << "\n";
  90.     }
  91.     else {
  92.         int mi = nL + nR >> 1;
  93.         Traversal(q, ls(id), nL,     mi);
  94.         Traversal(q, rs(id), mi + 1, nR);
  95.     }
  96.    
  97.     while (cnt--) Undo();
  98.     event[id].clear();
  99. }
  100.  
  101. void solve() {
  102.     int n, m, q, ai, bi;
  103.     char c;
  104.     cin >> n >> m >> q, cc_cnt = n;
  105.     iota(par, par + n, 0);
  106.     fill( sz,  sz + n, 1);
  107.    
  108.     map<pii, pii> con;
  109.     for (int i = 0; i < m; ++i) {
  110.         cin >> ai >> bi;
  111.         if (ai > bi) swap(ai, bi);
  112.         ++con[{ai, bi}].Y;
  113.     }
  114.     for (int i = 1; i <= q; ++i) {
  115.         cin >> c >> ai >> bi;
  116.         if (ai > bi) swap(ai, bi);
  117.        
  118.         if (c == 'N') {
  119.             if (con[{ai, bi}].Y == 0) con[{ai, bi}] = {i, 1};
  120.             else ++con[{ai, bi}].Y;
  121.         }
  122.         if (c == 'D') {
  123.             if (con[{ai, bi}].Y == 1) {
  124.                 AddEvent(con[{ai, bi}].X, i - 1, {ai, bi});
  125.                 con.erase({ai, bi});
  126.             }
  127.             else --con[{ai, bi}].Y;
  128.         }
  129.     }
  130.    
  131.     for (auto ev : con) {
  132.         if (ev.Y.Y >= 1) AddEvent(ev.Y.X, q, ev.X);
  133.     }
  134.     con.clear();
  135.    
  136.     Traversal(q);
  137. }
  138.  
  139. int32_t main() {
  140.     fastIO();
  141.    
  142.     int t;
  143.     cin >> t;
  144.     while (t--) solve();
  145.    
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement