Advertisement
tumaryui

Untitled

Mar 15th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define pb push_back
  4. #define pii pair<int, int>
  5. using namespace std;
  6.  
  7. const int N = 2e5 + 10, logn = 20, mod = 1e9 + 7;
  8. vector<int> gr[N];
  9. int tin[N], tout[N], up[logn][N], sz[N], timer, n, m, sum, par[N];
  10. map<pii, int> mp;
  11.  
  12. void dfs1(int v, int pr = 1) {
  13.     tin[v] = ++timer;
  14.     up[0][v] = pr;
  15.     for(int i = 1; i <= logn; i++) {
  16.         up[i][v] = up[i - 1][up[i - 1][v]];
  17.     }
  18.     sz[v] = 1;
  19.     par[v] = pr;
  20.     for(auto it: gr[v]) {
  21.         if(it != pr) {
  22.             dfs1(it, v);
  23.             sz[v] += sz[it];                       
  24.         }
  25.     }
  26.     tout[v] = ++timer;
  27. }
  28.  
  29. bool upper(int a, int b) {
  30.     return tin[a] <= tin[b] && tout[a] >= tout[b];
  31. }
  32.  
  33. int lca(int a, int b) {
  34.     if(upper(a, b)) return a;
  35.     if(upper(b, a)) return b;
  36.  
  37.     for(int i = 19; i >= 0; i--) {
  38.         if(!upper(up[i][a], b)) {
  39.             a = up[i][a];
  40.         }
  41.     }
  42.     return up[0][a];
  43. }
  44. void dfsum(int v, int pr = -1) {
  45.     for(auto it: gr[v]) {
  46.         if(it != pr) {
  47.             sum += mp[{v, it}] * (sz[it])*(n - sz[it]);
  48.             //sum %= mod;
  49.             dfsum(it, v);
  50.         }
  51.     }
  52. }
  53.  
  54. main() {
  55.     scanf("%lld %lld", &n, &m);
  56.  
  57.     for(int i = 1; i < n; i++) {
  58.         int l, r, w;
  59.         scanf("%lld %lld %lld", &l, &r, &w);
  60.         gr[l].pb(r);
  61.         gr[r].pb(l);
  62.         mp[{l, r}] = w;
  63.         mp[{r, l}] = w;
  64.     }
  65.     dfs1(1);
  66.     dfsum(1);
  67.     cout << sum << endl;
  68.     while(m--) {
  69.         int l, r;
  70.         scanf("%lld %lld", &l, &r);
  71.         int x = lca(l, r), pr = -1;
  72.         while(l != x && upper(x, l)) {
  73.             // left
  74.             //change sum
  75.             int w = mp[{l, par[l]}];
  76.             sum -= w * sz[l] * (n - sz[l]);
  77.             //
  78.             //change mp
  79.             mp[{l, par[l]}] = sqrt(w);
  80.             mp[{par[l], l}] = sqrt(w);
  81.             w = mp[{par[l], l}];
  82.             sum += w * sz[l] * (n - sz[l]);
  83.             sum %= mod;
  84.  
  85.             //стягивание
  86.             if(w == 1 && pr != -1 && mp[{pr, r}] == 1) {
  87.                 par[pr] = par[l];
  88.             }
  89.             pr = l;
  90.             l = par[l];
  91.         }
  92.         pr = -1;
  93.         while(r != x && upper(x, r)) {
  94.             //right
  95.             int w = mp[{r, par[r]}];
  96.             sum -= w * sz[r] * (n - sz[r]);
  97.             //change mp
  98.             mp[{r, par[r]}] = sqrt(w);
  99.             mp[{par[r], r}] = sqrt(w);
  100.             w = mp[{par[r], r}];
  101.             sum += w * sz[r] * (n - sz[r]);
  102.             sum %= mod;
  103.  
  104.             //стягивание
  105.             if(w == 1 && pr != -1 && mp[{pr, r}] == 1) {
  106.                 par[pr] = par[r];
  107.             }
  108.             pr = r;
  109.             r = par[r];
  110.         }
  111.         printf("%lld ", sum);      
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement