Advertisement
welleyth

RollBack

Jul 5th, 2022 (edited)
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. //#define int long long
  8. #define mp make_pair
  9. #define pb push_back
  10.  
  11. //#pragma GCC optimize("Ofast")
  12. //#pragma GCC optimize("unroll-loops")
  13. //#pragma GCC target("avx2")
  14.  
  15. constexpr long long INF = (long long)2e9;
  16. constexpr int N = (int)5e5 + 111;
  17. constexpr int md = (int)1e9 + 7;
  18. constexpr int mdPower = (int)1e9+7 - 1;
  19. constexpr int P = (int)998244343;
  20. constexpr double PI = acos(-1);
  21.  
  22. //typedef __int128 _uint;
  23. typedef long long ll;
  24.  
  25. mt19937_64 rnd(time(nullptr));
  26.  
  27. void add(int& a,int b){
  28.     a += b; if(a >= md) a -= md;
  29. }
  30. void sub(int& a,int b){
  31.     a -= b; while(a < 0) a += md;
  32. }
  33.  
  34. int bpow(int a,int b){
  35.     if(b == 0)
  36.         return 1;
  37.     if(b % 2 == 0){
  38.         int t = bpow(a,b>>1);
  39.         return 1ll*t*t%md;
  40.     }
  41.     return 1ll * a*bpow(a,b-1) % md;
  42. }
  43.  
  44. int inv(int a){
  45.     return bpow(a,md-2);
  46. }
  47.  
  48. //int fac[N],invfac[N];
  49. //
  50. //void init(){
  51. //    fac[0] = 1;
  52. //    for(int i = 1; i < N; i++){
  53. //        fac[i] = (fac[i-1] * i) % md;
  54. //    }
  55. //    invfac[N-1] = inv(fac[N-1]);
  56. //    for(int i = N-2; i >= 0; i--){
  57. //        invfac[i] = (invfac[i+1] * (i+1))%md;
  58. //    }
  59. //    return;
  60. //}
  61. //
  62. //int C(int n,int k){
  63. //    if(k > n)
  64. //        return 0;
  65. //    return fac[n] * invfac[k] % md * invfac[n-k] % md;
  66. //}
  67. //
  68. //int A(int n,int k){
  69. //    if(k > n)
  70. //        return 0;
  71. //    return fac[n] * invfac[n-k] % md;
  72. //}
  73. int parent[N];
  74. int sz[N];
  75. vector<pair<pair<int,int>,pair<int,int>>> history;
  76. int deep[N];
  77.  
  78. int get(int x){
  79.     if(parent[x] == x)
  80.         return x;
  81.     return get(parent[x]);
  82. }
  83.  
  84. void union_sets(int a,int b){
  85.     a = get(a), b = get(b);
  86.     if(a == b)
  87.         return;
  88.     if(deep[a] > deep[b])
  89.         swap(a,b);
  90.     history.pb(mp(mp(a,parent[a]),mp(sz[b],deep[b])));
  91.     deep[b] = max(deep[b],deep[a]+1);
  92.     parent[a] = b;
  93.     sz[b] += sz[a];
  94.     return;
  95. }
  96.  
  97. void roll_back(int S){
  98.     assert(!history.empty());
  99.     while(history.size() > S){
  100.         int a = history.back().first.first, b = history.back().first.second, prevSZ = history.back().second.first;
  101.         int d = history.back().second.second;
  102.         history.pop_back();
  103.         sz[parent[a]] = prevSZ;
  104.         deep[parent[a]] = d;
  105.         parent[a] = b;
  106.     }
  107.     return;
  108. }
  109.  
  110. vector<pair<int,int>> t[4*N];
  111.  
  112. void upd(int v,int l,int r,int tl,int tr,pair<int,int>& x){
  113.     if(l > r || tl > tr)
  114.         return;
  115.     if(l == tl && r == tr){
  116.         t[v].pb(x);
  117.         return;
  118.     }
  119.     int m = (l+r)>>1;
  120.     upd(v<<1,l,m,tl,min(tr,m),x);
  121.     upd(v<<1|1,m+1,r,max(tl,m+1),tr,x);
  122.     return;
  123. }
  124. int getSz(int a){
  125.     a = get(a);
  126.     return sz[a];
  127. }
  128.  
  129. vector<pair<int,int>> edges;
  130. int cnt[4*N];
  131. int Query[4*N];
  132. int ans[N];
  133. map<pair<int,int>,int> pr;
  134. map<pair<int,int>,int> cur;
  135.  
  136. void updEdge(int v,int l,int r,int tl,int tr,pair<int,int>& x){
  137.     if(l > r || tl > tr)
  138.         return;
  139.     if(l == tl && r == tr){
  140.         t[v].pb(x);
  141.         return;
  142.     }
  143.     int m = (l+r)>>1;
  144.     updEdge(v<<1,l,m,tl,min(tr,m),x);
  145.     updEdge(v<<1|1,m+1,r,max(tl,m+1),tr,x);
  146.     return;
  147. }
  148.  
  149. void updQuery(int v,int l,int r,int pos,int x){
  150.     if(l > r)
  151.         return;
  152.     if(l == r){
  153.         Query[v] = x;
  154.         cnt[v] = 1;
  155.         return;
  156.     }
  157.     int m = (l+r)>>1;
  158.     if(pos <= m)
  159.         updQuery(v<<1,l,m,pos,x);
  160.     else
  161.         updQuery(v<<1|1,m+1,r,pos,x);
  162.     cnt[v] = cnt[v<<1] + cnt[v<<1|1];
  163.     return;
  164. }
  165.  
  166. int CC = 0;
  167.  
  168. void go(int v,int l,int r){
  169.     if(l > r)
  170.         return;
  171.     int sz = history.size();
  172. //    CC++;
  173. //    if(CC % 10000 <= 5)
  174. //        cerr << "go " << v << " " << l << " " << r << "\n";
  175.     for(auto&[x,y] : t[v]){
  176.         union_sets(x,y);
  177. //        cerr << "adding " << x << " " << y << "\n";
  178.     }
  179.     if(l == r){
  180.         if(Query[l] != 0){
  181. //            cerr << "have " << l << "\n";
  182.             int x = Query[l];
  183.             ans[l] = getSz(x);
  184. //            cerr << "x = " << x << "\n";
  185. //            cerr << "sz = " << ans[l] << "\n";
  186.         }
  187.     } else {
  188.         int m = (l+r)>>1;
  189.         go(v<<1,l,m);
  190.         go(v<<1|1,m+1,r);
  191.     }
  192.     roll_back(sz);
  193.     return;
  194. }
  195.  
  196. int p[N];
  197. vector<int> g[N];
  198. vector<int> gr[N];
  199.  
  200. void dfs(int v){
  201.     for(auto& to : g[v]){
  202.         if(to == p[v])
  203.             continue;
  204.         p[to] = v;
  205.         dfs(to);
  206.     }
  207.     return;
  208. }
  209.  
  210. void solve(){
  211.     int n,q;
  212.     n = q = 100000;
  213. //    cin >> n >> q;
  214.  
  215.     auto start_time = chrono::steady_clock::now();
  216.  
  217.     for(int i = 0; i < N; i++){
  218.         parent[i] = i;
  219.         sz[i] = 1;
  220.         deep[i] = 1;
  221.     }
  222.  
  223.     for(int i = 1; i < n; i++){
  224.         int a,b;
  225. //        cin >> a >> b;
  226.         a = rnd()%i + 1;
  227.         b = i;
  228.         g[a].pb(b);
  229.         g[b].pb(a);
  230.         if(a > b)
  231.             swap(a,b);
  232.         edges.pb(mp(a,b));
  233.         cur[mp(a,b)] = 1;
  234.         pr[mp(a,b)] = 1;
  235.     }
  236.  
  237.     dfs(1);
  238.  
  239.     for(int i = 1; i <= q; i++){
  240.         int tp,x;
  241.         tp = rnd()%2+1;
  242.         if(tp == 1) x = rnd()%(n-1) + 2; else x = rnd()%n+1;
  243. //        cin >> tp >> x;
  244.         if(tp == 1){
  245.             int a = p[x], b = x;
  246.             if(a > b)
  247.                 swap(a,b);
  248.             cur[mp(a,b)] ^= 1;
  249. //            cerr << "edge " << a << " " << b << "\n";
  250.             int l = pr[mp(a,b)];
  251.             if(cur[mp(a,b)] == false){
  252.                 pair<int,int> x = mp(a,b);
  253.                 updEdge(1,1,q,l,i,x);
  254.             } else {
  255.                 pr[mp(a,b)] = i;
  256.             }
  257.         } else {
  258. //            cerr << "query " << i << "\n";
  259. //            updQuery(1,1,q,i,x);
  260.             Query[i] = x;
  261.         }
  262.     }
  263.  
  264.     for(int i = 2; i <= n; i++){
  265.         int a = i, b = p[i];
  266.         if(a > b)
  267.             swap(a,b);
  268.         if(cur[mp(a,b)] == 1){
  269.             int l = pr[mp(a,b)];
  270.             pair<int,int> x = mp(a,b);
  271.             updEdge(1,1,q,l,q,x);
  272.         }
  273.     }
  274.  
  275.     auto cur_time = chrono::steady_clock::now();
  276.     int dur = chrono::duration_cast<chrono::milliseconds>(cur_time-start_time).count();
  277.     cerr << "dur = " << dur << "\n";
  278.  
  279.     for(int i = 1; i <= q; i++) ans[i] = -1;
  280.  
  281.     go(1,1,q);
  282.  
  283.     for(int i = 1; i <= q; i++){
  284.         if(ans[i] != -1)
  285.             cout << ans[i] << "\n";
  286.     }
  287.  
  288.     return;
  289. }
  290.  
  291. signed main(){
  292.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  293.     int tests = 1;
  294. //    cin >> tests;
  295.     for(int test = 1; test <= tests; test++){
  296. //        cerr << "test = " << test << "\n";
  297.         solve();
  298.     }
  299.     return 0;
  300. }
  301. /**
  302.  
  303.  
  304. **/
  305.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement