This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "factories.h"
#include<bits/stdc++.h>
using namespace std;
vector<vector<pair<int,long long>>> graph;
vector<vector<int>> sparse(20);
vector<int> in,out,first,depth,loga,col;
vector<long long> dist;
vector<long long> DP1,DP2;
void calc(int u,int p,long long &ans){
    DP1[u]=1e15,DP2[u]=1e15;
    if(col[u]==0){
        DP1[u]=0;
    }
    else if(col[u]==1){
        DP2[u]=0;
    }
    for(pair<int,long long> &x:graph[u]){
        int v=x.first;
        long long w=x.second;
        if(v!=p){
            calc(v,u,ans);
            DP1[u]=min(DP1[u],DP1[v]+w);
            DP2[u]=min(DP2[u],DP2[v]+w);
        }
    }
    ans=min(ans,DP1[u]+DP2[u]);
}
int tim=0;
void DFS(int u,int p){
    sparse[0].push_back(u);
    if(first[u]==-1){
        first[u]=sparse[0].size()-1;
    }
    in[u]=tim;
    tim++;
    for(pair<int,long long> &x:graph[u]){
        int v=x.first;
        long long w=x.second;
        if(v!=p){
            dist[v]=dist[u]+w;
            depth[v]=depth[u]+1;
            DFS(v,u);
        }
    }
    out[u]=tim-1;
    if(p!=-1){
        sparse[0].push_back(p);
    }
}
int cmp1(int u,int v){
    if(depth[u]<depth[v]){
        return u;
    }
    return v;
}
int LCA(int u,int v){
    int l=first[u],r=first[v];
    if(l>r){
        swap(l,r);
    }
    return cmp1(sparse[loga[r-l+1]][l],sparse[loga[r-l+1]][r-(1<<loga[r-l+1])+1]);
}
void Init(int n,int a[],int b[],int d[]){
    graph.resize(n);
    in.resize(n);
    out.resize(n);
    first.resize(n);
    dist.resize(n);
    depth.resize(n);
    DP1.resize(n);
    DP2.resize(n);
    col.resize(n);
    fill(first.begin(),first.end(),-1);
    fill(col.begin(),col.end(),-1);
    dist[1]=0;
    depth[1]=0;
    for(int i=0;i<n-1;i++){
        graph[a[i]].push_back({b[i],d[i]});
        graph[b[i]].push_back({a[i],d[i]});
    }
    DFS(0,-1);
    loga.resize(sparse[0].size()+1);
    loga[1]=0;
    for(int i=2;i<=sparse[0].size();i++){
        loga[i]=loga[i>>1]+1;
    }
    for(int i=1;i<20;i++){
        for(int j=0;j+(1<<i)<=sparse[0].size();j++){
            sparse[i].push_back(cmp1(sparse[i-1][j],sparse[i-1][j+(1<<(i-1))]));
        }
    }
    for(int i=0;i<n;i++){
        graph[i].clear();
        graph[i].resize(0);
    }
}
bool cmp2(int u,int v){
    return (in[u]<in[v]);
}
long long Query(int s,int x[],int t,int y[]){
    vector<int> c;
    for(int i=0;i<s;i++){
        c.push_back(x[i]);
        col[x[i]]=0;
    }
    for(int i=0;i<t;i++){
        c.push_back(y[i]);
        col[y[i]]=1;
    }
    sort(c.begin(),c.end(),cmp2);
    for(int i=1;i<s+t;i++){
        c.push_back(LCA(c[i],c[i-1]));
    }
    sort(c.begin(),c.end(),cmp2);
    c.erase(unique(c.begin(),c.end()),c.end());
    /*for(int i=0;i<c.size();i++){
        cout << c[i] << ' ';
    }
    cout << endl;*/
    stack<int> st;
    for(int i=0;i<c.size();i++){
        while(!st.empty()&&out[c[i]]>out[st.top()]){
            st.pop();
        }
        if(!st.empty()){
          //  cout << c[i] << ' ' << st.top() << ' ' << abs(dist[c[i]]-dist[st.top()]) << endl;
            graph[c[i]].push_back({st.top(),abs(dist[c[i]]-dist[st.top()])});
            graph[st.top()].push_back({c[i],abs(dist[c[i]]-dist[st.top()])});
        }
        st.push(c[i]);
    }
    long long ans=1e18;
    calc(c[0],-1,ans);
    for(int i=0;i<c.size();i++){
        graph[c[i]].clear();
        graph[c[i]].resize(0);
    }
    for(int i=0;i<s;i++){
        col[x[i]]=-1;
    }
    for(int i=0;i<t;i++){
        col[y[i]]=-1;
    }
    return ans;
}
/*signed main(){
    int n,q;
    cin >> n >> q;
    int a[n-1],b[n-1],d[n-1];
    for(int i=0;i<n-1;i++){
        cin >> a[i] >> b[i] >> d[i];
    }
    Init(n,a,b,d);
    while(q--){
        int s,t;
        cin >> s >> t;
        int x[s],y[t];
        for(int i=0;i<s;i++){
            cin >> x[i];
        }
        for(int i=0;i<t;i++){
            cin >> y[i];
        }
        cout << Query(s,x,t,y) << endl;
    }
}*/
Compilation message (stderr)
factories.cpp: In function 'void Init(int, int*, int*, int*)':
factories.cpp:84:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |     for(int i=2;i<=sparse[0].size();i++){
      |                 ~^~~~~~~~~~~~~~~~~~
factories.cpp:88:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |         for(int j=0;j+(1<<i)<=sparse[0].size();j++){
      |                     ~~~~~~~~^~~~~~~~~~~~~~~~~~
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:121:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |     for(int i=0;i<c.size();i++){
      |                 ~^~~~~~~~~
factories.cpp:134:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  134 |     for(int i=0;i<c.size();i++){
      |                 ~^~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |