Advertisement
Guest User

Untitled

a guest
Jan 13th, 2021
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. using namespace __gnu_pbds;
  4. using namespace std;
  5. typedef long long ll;
  6. typedef unsigned long long ull;
  7. typedef long double ld;
  8. typedef pair <int, int> pii;
  9. typedef pair <ll, ll> pll;
  10. typedef tuple<int, int, int> tiii;
  11. typedef tuple<int, int, int, int> tiiii;
  12. typedef set <int> si;
  13. typedef map <int, int> mii;
  14. typedef vector <int> vi;
  15. typedef vector <ll> vll;
  16. typedef vector <vector <int>> vvi;
  17. typedef vector<pii> vpii;
  18. #define F(i, a, b) for(int i = (int)a; i <= (int)b; i++)
  19. #define f(i, a, b) for(int i = (int)a; i >= (int)b; i--)
  20. #define F2(i, a, b) for(int i = (int)a; i <= (int)b; i+=2)
  21. #define f2(i, a, b) for(int i = (int)a; i >= (int)b; i-=2)
  22. #define wh(n) int iteration = n; while(iteration--)
  23. #define For(t, it) for(auto it = (t).begin(); it != (t).end(); ++it)
  24. #define IN insert
  25. #define PB push_back
  26. #define MP make_pair
  27. #define MT make_tuple
  28. #define RS resize
  29. #define uset unordered_set
  30. #define umap unordered_map
  31. #define RBT tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
  32. ld const PI = acos(-1);
  33.  
  34. int const N = 3e5 + 4, T = (1<<19);
  35. int par[N], sz[N];
  36. struct edge{
  37. int ql, qr, v, u;
  38. edge(){}
  39. edge(int a, int b, int c, int d) : ql(a), qr(b), v(c), u(d) {}
  40. };
  41.  
  42.  
  43. int p_dsu[2*N];
  44. int it_dsu = -1, cmp;
  45.  
  46. int get_par(int v){
  47. while(par[v] != v)
  48. v = par[v];
  49. return v;
  50. }
  51.  
  52. void unite(edge e){
  53. int a = get_par(e.v), b = get_par(e.u);
  54. if(a == b)
  55. return;
  56. if(sz[a] < sz[b])
  57. swap(a, b);
  58. p_dsu[++it_dsu] = b;
  59. sz[a] += sz[b];
  60. par[b] = a;
  61. cmp--;
  62. }
  63.  
  64. void persist(){
  65. p_dsu[++it_dsu] = -1;
  66. }
  67. void restore(){
  68. while(it_dsu >= 0){
  69. int v = p_dsu[it_dsu--];
  70. if(v == -1)
  71. break;
  72. cmp++;
  73. sz[par[v]] -= sz[v];
  74. par[v] = v;
  75. }
  76. }
  77.  
  78. bool need[N];
  79. vector<edge> gr[2*T];
  80.  
  81. void solve(int v, int tl, int tr){
  82. persist();
  83. int tm = (tl + tr)>>1, l = v<<1, r = l|1;
  84. //cerr << tl << ' ' << tr << ": ";
  85. int gv = v|1;
  86. for(edge e : gr[gv]){
  87. if(e.ql <= tl && tr <= e.qr){
  88. unite(e);
  89. //cerr << e.v << ' ' << e.u << ", ";
  90. continue;
  91. }
  92. if(max(tl, e.ql) <= min(tr, e.qr))
  93. gr[r].PB(e);
  94. }
  95. //cerr << '\n';
  96. if(tl == tr){
  97. if(need[tl])
  98. cout << cmp << '\n';
  99. }else{
  100. solve(l, tl, tm);
  101. solve(r, tm+1, tr);
  102. }
  103. restore();
  104. }
  105.  
  106. map<pii, int> was;
  107. //#define LOCAL
  108. int main(){
  109. ios_base::sync_with_stdio(false);
  110. cin.tie(NULL);
  111. #ifdef LOCAL
  112. freopen("in", "r", stdin);
  113. freopen("out", "w", stdout);
  114. #endif
  115. int n, m;
  116. cin >> n >> m;
  117. F(i, 1, n){
  118. par[i] = i;
  119. sz[i] = 1;
  120. }
  121. cmp = n;
  122. char tp;
  123. int a, b;
  124. F(i, 1, m){
  125. cin >> tp;
  126. if(tp == '?'){
  127. need[i] = 1;
  128. }else{
  129. cin >> a >> b;
  130. if(a > b)
  131. swap(a, b);
  132. if(tp == '+')
  133. was[MP(a, b)] = i;
  134. else{
  135. auto it = was.find(MP(a, b));
  136. gr[1].PB(edge(it->second, i-1, a, b));
  137. was.erase(it);
  138. }
  139. }
  140. }
  141. for(auto it : was)
  142. gr[1].PB(edge(it.second, m, it.first.first, it.first.second));
  143. solve(1, 1, m+1);
  144. return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement