Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- #define pb push_back
- #define pii pair<int, int>
- using namespace std;
- const int N = 2e5 + 10, logn = 20, mod = 1e9 + 7;
- vector<int> gr[N];
- int tin[N], tout[N], up[logn][N], sz[N], timer, n, m, sum, par[N];
- map<pii, int> mp;
- void dfs1(int v, int pr = 1) {
- tin[v] = ++timer;
- up[0][v] = pr;
- for(int i = 1; i <= logn; i++) {
- up[i][v] = up[i - 1][up[i - 1][v]];
- }
- sz[v] = 1;
- par[v] = pr;
- for(auto it: gr[v]) {
- if(it != pr) {
- dfs1(it, v);
- sz[v] += sz[it];
- }
- }
- tout[v] = ++timer;
- }
- bool upper(int a, int b) {
- return tin[a] <= tin[b] && tout[a] >= tout[b];
- }
- int lca(int a, int b) {
- if(upper(a, b)) return a;
- if(upper(b, a)) return b;
- for(int i = 19; i >= 0; i--) {
- if(!upper(up[i][a], b)) {
- a = up[i][a];
- }
- }
- return up[0][a];
- }
- void dfsum(int v, int pr = -1) {
- for(auto it: gr[v]) {
- if(it != pr) {
- sum += mp[{v, it}] * (sz[it])*(n - sz[it]);
- //sum %= mod;
- dfsum(it, v);
- }
- }
- }
- main() {
- scanf("%lld %lld", &n, &m);
- for(int i = 1; i < n; i++) {
- int l, r, w;
- scanf("%lld %lld %lld", &l, &r, &w);
- gr[l].pb(r);
- gr[r].pb(l);
- mp[{l, r}] = w;
- mp[{r, l}] = w;
- }
- dfs1(1);
- dfsum(1);
- cout << sum << endl;
- while(m--) {
- int l, r;
- scanf("%lld %lld", &l, &r);
- int x = lca(l, r), pr = -1;
- while(l != x && upper(x, l)) {
- // left
- //change sum
- int w = mp[{l, par[l]}];
- sum -= w * sz[l] * (n - sz[l]);
- //
- //change mp
- mp[{l, par[l]}] = sqrt(w);
- mp[{par[l], l}] = sqrt(w);
- w = mp[{par[l], l}];
- sum += w * sz[l] * (n - sz[l]);
- sum %= mod;
- //стягивание
- if(w == 1 && pr != -1 && mp[{pr, r}] == 1) {
- par[pr] = par[l];
- }
- pr = l;
- l = par[l];
- }
- pr = -1;
- while(r != x && upper(x, r)) {
- //right
- int w = mp[{r, par[r]}];
- sum -= w * sz[r] * (n - sz[r]);
- //change mp
- mp[{r, par[r]}] = sqrt(w);
- mp[{par[r], r}] = sqrt(w);
- w = mp[{par[r], r}];
- sum += w * sz[r] * (n - sz[r]);
- sum %= mod;
- //стягивание
- if(w == 1 && pr != -1 && mp[{pr, r}] == 1) {
- par[pr] = par[r];
- }
- pr = r;
- r = par[r];
- }
- printf("%lld ", sum);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement