Advertisement
Guest User

Find tree

a guest
Nov 18th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define X first
  3. #define Y second
  4. #define pb push_back
  5. #define mp make_pair
  6. using namespace std;
  7. const int N=100002;
  8. const int deepmax=20;
  9. const long long P=1000000007;
  10. int n,m,SZ,center;
  11. int a[N],b[N],par[N],deep[N];
  12. long long A[deepmax][N],B[deepmax][N],Br[deepmax][N];
  13. bool fix[N];
  14. vector <int> v[N];
  15.  
  16. int input(){
  17.     scanf("%d%d",&n,&m);
  18.     for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
  19.     for (int i=2,x,y;i<=n;i++){
  20.         scanf("%d%d",&x,&y);
  21.         v[x].pb(y);
  22.         v[y].pb(x);
  23.     }
  24.     return 0;
  25. }
  26.  
  27. int fin(int x,int from){
  28.     int S=1;
  29.     for (int i=0;i<v[x].size();i++)
  30.     if (v[x][i]!=from)
  31.         if (!fix[v[x][i]])
  32.         S+=fin(v[x][i],x);
  33.     if (S*2>=SZ && center==0) center=x;
  34.     return S;
  35. }
  36.  
  37. void dfs(int x,int from,int d){
  38.     B[d][x]=(B[d][from]*a[x]+b[x])%P;
  39.     Br[d][x]=(A[d][from]*b[x]+Br[d][from])%P;
  40.     A[d][x]=A[d][from]*a[x]%P;
  41.     for (int i=0;i<v[x].size();i++)
  42.     if (v[x][i]!=from)
  43.         if (!fix[v[x][i]])
  44.         dfs(v[x][i],x,d);
  45. }
  46.  
  47. void pre(int x,int from){
  48.     SZ=fin(x,x);
  49.     center=0;
  50.     fin(x,x);
  51.     x=center;
  52.  
  53.     par[x]=from;
  54.     deep[x]=deep[from]+1;
  55.     fix[x]=1;
  56.  
  57.     A[deep[x]][x]=1;
  58.     B[deep[x]][x]=Br[deep[x]][x]=0;
  59.  
  60.     for (int i=0;i<v[x].size();i++)
  61.     if (!fix[v[x][i]])
  62.         dfs(v[x][i],x,deep[x]),
  63.         pre(v[x][i],x);
  64. }
  65.  
  66. int LCA(int x,int y){
  67.     while (deep[x]>deep[y]) x=par[x];
  68.     while (deep[x]<deep[y]) y=par[y];
  69.     while (x!=y) x=par[x],y=par[y];
  70.     return x;
  71. }
  72.  
  73. int sol(){
  74.     pre(1,0);
  75.     int x,y,z;
  76.     long long ans=0;
  77.     while (m--){
  78.         scanf("%d%d%d",&x,&y,&z);
  79.         ans=z;
  80.         z=LCA(x,y);
  81.         ans=(ans*A[deep[z]][x]+Br[deep[z]][x])%P;
  82.         ans=(ans*a[z]+b[z])%P;
  83.         ans=(ans*A[deep[z]][y]+B[deep[z]][y])%P;
  84.         printf("%lld\n",ans);
  85.     }
  86.     return 0;
  87. }
  88.  
  89. int main() {
  90.     input();
  91.     sol();
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement