Advertisement
matheus_monteiro

2476 - Entregas do Noel

Nov 8th, 2024
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAX = 1e6 + 10;
  5. const int OO = 0x3f3f3f3f;
  6. const double EPS = 1e-4;
  7.  
  8. #define bug(x) cout << #x << " = " << x << '\n'
  9. #define FOR(i, a, n) for(int i = a; i < (int)n; i++)
  10. #define REP(i, n) FOR(i, 0, n)
  11. #define fi first
  12. #define se second
  13. #define pb push_back
  14. #define mt make_tuple
  15. #define all(vetor) vetor.begin(), vetor.end()
  16. #define X real()
  17. #define Y imag()
  18. //#define gc getchar_unlocked
  19.  
  20. typedef long long ll;
  21. typedef long double ld;
  22. typedef pair<int, int> ii;
  23. typedef pair<int, ii> iii;
  24. typedef complex<ll> Pll;
  25. typedef complex<ld> Pld;
  26.  
  27. int SQ, q, n;
  28. unordered_map<string, int> mapa;
  29. int vertex[MAX], p[MAX], in[MAX], out[MAX], LCA[MAX], ans[MAX], rep;
  30. int anc[MAX][20], max_log, depth[MAX], pp[MAX], node[MAX], freq[MAX], seq[2 * MAX];
  31. vector<ii> que;
  32. vector<int> G[MAX];
  33. int tempo;
  34.  
  35. void dfs(int v, int p, int d)
  36. {
  37.     depth[v] = d;
  38.     anc[v][0] = p;
  39.     seq[tempo] = v;
  40.     in[v] = tempo++;
  41.     max_log = max(max_log, 1 + (int)log2(d));
  42.     for(int &u : G[v])
  43.         if(u != p)
  44.             dfs(u, v, d + 1);
  45.     seq[tempo] = v;
  46.     out[v] = tempo++;
  47. }
  48.  
  49. void build()
  50. {
  51.     memset(anc, -1, sizeof(anc));
  52.     dfs(0, -1, 0);
  53.     for(int j = 1; j <= max_log; j++)
  54.         for(int i = 0; i < n; i++)
  55.             if(anc[i][j-1] != -1)
  56.                 anc[i][j] = anc[anc[i][j-1]][j-1];
  57. }
  58.  
  59. int walk(int v, int k)
  60. {
  61.     while(k) v = anc[v][(int)log2(k&-k)], k -= k&-k;
  62.     return v;
  63. }
  64.  
  65. int lca(int u, int v)
  66. {
  67.     if(depth[u] > depth[v]) u = walk(u, depth[u] - depth[v]);
  68.     if(depth[u] < depth[v]) v = walk(v, depth[v] - depth[u]);
  69.     if(u == v) return u;
  70.     for(int i = max_log; i >= 0; i--)
  71.         if(anc[u][i] != anc[v][i])
  72.             u = anc[u][i], v = anc[v][i];
  73.     return anc[u][0];
  74. }
  75.  
  76. bool cmp(int a, int b)
  77. {
  78.     if(que[a].fi / SQ == que[b].fi / SQ)
  79.     {
  80.         if((que[a].fi / SQ) & 1)
  81.             return que[a].se > que[b].se;
  82.         else
  83.             return que[a].se < que[b].se;
  84.     }
  85.     else
  86.         return que[a].fi < que[b].fi;
  87. }
  88.  
  89. inline void mo(int i)
  90. {
  91.     int v = seq[i];
  92.     if(node[v] and --freq[vertex[v]] == 0) rep--;
  93.     if(!node[v] and ++freq[vertex[v]] == 1) rep++;
  94.     node[v] ^= 1;
  95. }
  96.  
  97. int main()
  98. {  
  99.     scanf(" %d %d", &n, &q);
  100.     char brinquedo[100];
  101.     string aux;
  102.     int id = 1;
  103.     REP(i, n)
  104.     {
  105.         scanf("%s", brinquedo);
  106.         aux = brinquedo;
  107.         auto it = mapa.find(aux);
  108.         if(it == mapa.end())
  109.         {  
  110.             vertex[i] = id;
  111.             mapa[aux] = id++;
  112.         }
  113.         else
  114.             vertex[i] = it->se;
  115.     }
  116.     int u, v;
  117.     REP(i, n-1)
  118.     {
  119.         scanf("%d %d", &u, &v); u--; v--;
  120.         G[u].pb(v);
  121.         G[v].pb(u);
  122.     }
  123.     build();
  124.     REP(i, q)
  125.     {
  126.         scanf("%d %d", &u, &v); u--; v--;
  127.         int l, r;
  128.         LCA[i] = lca(u, v);
  129.         if(in[u] > in[v])
  130.             swap(u, v);
  131.         if(u == LCA[i])
  132.             que.pb({in[LCA[i]], in[v]});
  133.         else            
  134.             que.pb({out[u], in[v]});
  135.         pp[i] = i;
  136.     }
  137.     SQ = sqrt(n);
  138.     sort(pp, pp + q, cmp);
  139.  
  140.     int L = 0, R = 0;
  141.     REP(i, q)
  142.     {
  143.         int l = que[pp[i]].fi, r = que[pp[i]].se, LC = LCA[pp[i]];
  144.         while(L < l) mo(L++);
  145.         while(L > l) mo(--L);
  146.         while(R < r + 1) mo(R++);
  147.         while(R > r + 1) mo(--R);
  148.         if(LC != seq[l])
  149.             mo(in[LC]);
  150.         ans[pp[i]] = rep;
  151.         if(LC != seq[l])
  152.             mo(in[LC]);
  153.     }
  154.     REP(i, q)
  155.         printf("%d\n", ans[i]);        
  156.  
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement