Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- int n,t,nr;
- long long odleglosc[200005];
- vector < pair<int,long long> >way[200005];
- int up[200005][20];
- int preorder[200005];
- int postorder[200005];
- void dfs(int x,int y)
- {
- preorder[x]= ++nr;
- up[x][0]=y;
- for(int i=1;i<=19;i++){ up[x][i]=up[ up[x][i-1] ][i-1]; }
- for( int i=0; i < way[x].size();i++)
- {
- int pp=way[x][i].first;
- long long qq=way[x][i].second;
- if(preorder[pp]==0)
- {
- odleglosc[pp]=odleglosc[x]+qq;
- dfs(pp,x);
- }
- }
- postorder[x]= ++nr;
- }
- bool daddy(int a,int b)//a przodkiem b
- {
- return preorder[a]<=preorder[b] && postorder[a]>=postorder[b];
- }
- int LCA(int a,int b)
- {
- if( daddy(a,b) ){ return a; }
- if( daddy(b,a) ){ return b; }
- for(int i=19;i>=0;i--)
- {
- if( !daddy( up[a][i],b ) ){ a=up[a][i]; }
- }
- return up[a][0];
- }
- long long wynik(int a,int b)
- {
- return ( odleglosc[a] + odleglosc[b] ) - ( 2 * odleglosc[ LCA(a,b) ]);
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(NULL);
- cin>>n>>t;
- for(int i=1;i<n;i++){
- int a,b;
- long long d;
- cin>>a>>b>>d;
- way[a].emplace_back( make_pair(b,d) );
- way[b].emplace_back( make_pair(a,d) );
- }
- dfs(1,1);
- for(int i=0;i<t;i++){ int a,b;cin>>a>>b; cout<<wynik(a,b)<<'\n'; }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement