Advertisement
MinhNGUYEN2k4

Untitled

Dec 7th, 2021
701
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 100005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iiii pair< ii , ii >
  14. #define viiii vector< iiii >
  15. #define vi vector<int>
  16. #define vii vector< ii >
  17. #define bit(x, i) (((x) >> (i)) & 1)
  18. #define Task "CCOLOR"
  19.  
  20. using namespace std;
  21.  
  22. typedef long double ld;
  23. const int inf = 1e10;
  24. const int minf = -1e10;
  25.  
  26. int n, q;
  27. set<int> g[N];
  28. int sz[N], par[N];
  29. int d[N], f[N][22];
  30. multiset<int> ans[N];
  31. int color[N];
  32.  
  33. //==preprocess==\\
  34.  
  35. void DFS(int u, int p){
  36.     for(int i=1; i<20; i++){
  37.         f[u][i] = f[f[u][i-1]][i-1];
  38.     }
  39.     for(auto v : g[u]){
  40.         if (v==p) continue;
  41.         d[v] = d[u]+1;
  42.         f[v][0] = u;
  43.         DFS(v,u);
  44.     }
  45. }
  46.  
  47. //==LCA==\\
  48.  
  49. int lca(int u, int v) {
  50.     if (d[u] < d[v]) swap(u, v);
  51.     int delta = d[u] - d[v];
  52.  
  53.     for (int i = 19; i >= 0; i--)
  54.         if ((delta >> i) & 1) u = f[u][i];
  55.  
  56.     if (u == v) return u;
  57.  
  58.     for (int i = 19; i >= 0; i--)
  59.         if (f[u][i] != f[v][i])
  60.             u = f[u][i], v = f[v][i];
  61.  
  62.     return f[u][0];
  63. }
  64.  
  65.  
  66. //==Distances==\\
  67.  
  68. int dis(int u, int v){
  69.     return d[u] + d[v] - 2*d[lca(u,v)];
  70. }
  71.  
  72.  
  73. //read file
  74.  
  75. void readfile()
  76. {
  77.     ios_base::sync_with_stdio(false);
  78.     cin.tie(0);cout.tie(0);
  79.     if (fopen(Task".inp","r"))
  80.     {
  81.         freopen(Task".inp","r",stdin);
  82.         freopen(Task".out","w",stdout);
  83.     }
  84.     cin >> n;
  85.     for(int i=1; i<n; i++){
  86.         int u, v; cin >> u >> v;
  87.         g[u].insert(v);
  88.         g[v].insert(u);
  89.     }
  90. }
  91.  
  92. void preprocess(){
  93.     DFS(1,-1);
  94. }
  95.  
  96. //building centroid tree
  97.  
  98. int dfs(int u, int p) {
  99.   sz[u] = 1;
  100.   for(auto v : g[u]) if(v != p) {
  101.     sz[u] += dfs(v, u);
  102.   }
  103.   return sz[u];
  104. }
  105. int centroid(int u, int p, int n) {
  106.   for(auto v : g[u]) if(v != p) {
  107.     if(sz[v] > n / 2) return centroid(v, u, n);
  108.   }
  109.   return u;
  110. }
  111. void build(int u, int p) {
  112.     int m = dfs(u, p);
  113.     int c = centroid(u, p, m);
  114.     if(p == 0) p = c;
  115.     par[c] = p;
  116.  
  117.     vector<int> tmp(g[c].begin(), g[c].end());
  118.     for(auto v : tmp) {
  119.         g[c].erase(v); g[v].erase(c);
  120.         build(v, c);
  121.     }
  122. }
  123.  
  124. //update query
  125.  
  126. void update(int u){
  127.     int x = u;
  128.     while(1){
  129.         int tmp = dis(u,x);
  130.         if (color[u]) ans[x].erase(ans[x].find(tmp));
  131.         else ans[x].insert(tmp);
  132.         if (par[x]==x) break;
  133.         x = par[x];
  134.     }
  135.     color[u] = 1-color[u];
  136. }
  137.  
  138. //find query
  139.  
  140. int get(int u){
  141.     int x = u;
  142.     int tmp = inf;
  143.     while (1){
  144.         if (*ans[x].begin()!=inf) tmp = min(tmp, dis(u,x) + *ans[x].begin());
  145.         if (par[x]==x) break;
  146.         x = par[x];
  147.     }
  148.     return (tmp==inf ? -1 : tmp);
  149. }
  150.  
  151. void proc()
  152. {
  153.     preprocess();
  154.     build(1,0);
  155.     for(int i=1; i<=n; i++) ans[i].insert(inf);
  156.     cin >> q;
  157.     for(int i=1; i<=q; i++){
  158.         int ty, u;
  159.         cin >> ty >> u;
  160.         if (ty==1) update(u);
  161.         else cout << get(u) << '\n';
  162.     }
  163. }
  164.  
  165. signed main()
  166. {
  167.     readfile();
  168.     proc();
  169.     return 0;
  170. }
  171.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement