AhmedAshraff

Untitled

Nov 23rd, 2024
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
  4. #define ll long long
  5. #define sz(s) (int)(s).size()
  6. #define all(s) (s).begin(),(s).end()
  7. using namespace std;
  8.  
  9. void File();
  10.  
  11. void sol();
  12.  
  13. const int N = 1e3;
  14. int lpf[N + 1];
  15. vector<int> cost[N + 1];
  16. int val[(int)2e5+1];
  17. vector<int> prime;
  18.  
  19. void sieve() {
  20.     for (int i = 2; i <= N; i++) {
  21.         if (lpf[i] == 0) {
  22.             lpf[i] = i;
  23.             prime.push_back(i);
  24.         }
  25.         for (int j: prime) {
  26.             if (j > lpf[i] || 1LL * i * j > N)break;
  27.             lpf[i * j] = j;
  28.         }
  29.     }
  30.     for (int i = 1; i <= N; i++) {
  31.         for (auto it: prime) {
  32.             cost[i].emplace_back((it - (i % it)) % it);
  33.         }
  34.     }
  35. }
  36.  
  37. class LCA {
  38.     int n, logN, root = 1;
  39.     vector<int> depth;
  40.     vector<vector<int>> adj, lca;
  41.     vector<vector<int>>sum;
  42.     void dfs(int node, int parent) {
  43.         lca[node][0] = parent;
  44.         sum[node]=cost[val[node]];
  45.         depth[node] = (~parent ? depth[parent] + 1 : 0);
  46.         if(~parent){
  47.             for (int i = 0; i < sz(prime); ++i) {
  48.                 sum[node][i]+=sum[parent][i];
  49.             }
  50.         }
  51.         for (int k = 1; k <= logN; k++) {
  52.             int up_parent = lca[node][k - 1];
  53.             if (~up_parent) {
  54.                 lca[node][k] = lca[up_parent][k - 1];
  55.             }
  56.         }
  57.         for (int child: adj[node])
  58.             if (child != parent)
  59.                 dfs(child, node);
  60.     }
  61.  
  62. public:
  63.     LCA(const vector<vector<int>> &_adj, int root = 1) : root(root), adj(_adj) {
  64.         adj = _adj;
  65.         n = adj.size() - 1;
  66.         logN = log2(n);
  67.         lca = vector<vector<int>>(n + 1, vector<int>(logN + 1, -1));
  68.         depth = vector<int>(n + 1);
  69.         sum=vector<vector<int>>(n+1,vector<int>(sz(prime)));
  70.         dfs(root, -1);
  71.     }
  72.  
  73.     int get_LCA(int x, int y) {
  74.         if (depth[x] < depth[y])
  75.             swap(x, y);
  76.         for (int k = logN; k >= 0; k--)
  77.             if (depth[x] - (1 << k) >= depth[y])
  78.                 x = lca[x][k];
  79.         if (x == y)
  80.             return x;
  81.         for (int k = logN; k >= 0; k--) {
  82.             if (lca[x][k] != lca[y][k]) {
  83.                 x = lca[x][k], y = lca[y][k];
  84.             }
  85.         }
  86.         return lca[x][0];
  87.     }
  88.  
  89.     int get_sum(int u, int v) {
  90.         int lc = get_LCA(u, v);
  91.         int p_lc=lca[lc][0];
  92.         int mn=1e9;
  93.         for (int i = 0; i < sz(prime); ++i) {
  94.             mn=min(mn,sum[u][i]+sum[v][i]-sum[lc][i]-(~p_lc?sum[p_lc][i]:0));
  95.         }
  96.         return mn;
  97.     }
  98. };
  99.  
  100. int main() {
  101.     boAshraf
  102.     File();
  103.     sieve();
  104.     int t = 1;
  105.     cin >> t;
  106.     while (t--) {
  107.         sol();
  108.     }
  109.     return 0;
  110. }
  111.  
  112. void sol() {
  113.     int n, q;
  114.     cin >> n >> q;
  115.     for (int i = 1; i <= n; i++) {
  116.         cin >> val[i];
  117.     }
  118.     vector<vector<int>> adj(n+1);
  119.     for (int i = 0; i < n - 1; ++i) {
  120.         int u, v;
  121.         cin >> u >> v;
  122.         adj[u].emplace_back(v);
  123.         adj[v].emplace_back(u);
  124.     }
  125.     LCA lc(adj);
  126.     while(q--){
  127.         int u,v;
  128.         cin>>u>>v;
  129.         cout<<lc.get_sum(u,v)<<'\n';
  130.     }
  131. }
  132.  
  133. void File() {
  134. #ifndef ONLINE_JUDGE
  135.     freopen("input.txt", "r", stdin);
  136.     freopen("output.txt", "w", stdout);
  137. #endif
  138. }
Advertisement
Add Comment
Please, Sign In to add comment