样例过了,但WA 0pts
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e4+5;
int n,m,T,sq_num,ro_num;
int dfn[N],low[N],fa[N],b[N],sum[N],dis[N],stot[N];
struct node{
int v,w;
};
vector<node> g[N],gg[N];
int deep[N],lp[N][30];
void sq_ro(int u,int v,int w){
sq_num++;
int s=w,p=v;
while(p!=fa[u]){
sum[p]=s;
s+=b[p];
p=fa[p];
}
sum[sq_num]=sum[u];
sum[u]=0;
p=v;
while(p!=fa[u]){
int t=min(sum[p],sum[sq_num]-sum[p]);
gg[sq_num].push_back({p,t});
gg[p].push_back({sq_num,t});
p=fa[p];
stot[p]=s;
}
}
void Tarjan(int u,int f){
dfn[u]=low[u]=++ro_num;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(v==f)continue;
if(dfn[v]==0){
fa[v]=u;
b[v]=w;
Tarjan(v,u);
low[u]=min(low[u],low[v]);
}else low[u]=min(low[u],dfn[v]);
if(low[v]<=dfn[u])continue;
gg[u].push_back({v,w});
gg[v].push_back({u,w});
}
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(fa[v]==u)continue;
if(dfn[v]<=dfn[u])continue;
sq_ro(u,v,w);
}
}
void dfs(int u,int fat) {
deep[u]=deep[fat]+1;
lp[u][0]=fat;
for(int i=1; (1<<i)<=deep[u]; i++) {
lp[u][i]=lp[lp[u][i-1]][i-1];
}
for(int i=0;i<gg[u].size();i++) {
int v=gg[u][i].v,w=gg[u][i].w;
if(v!=fat) {
dis[v]=dis[u]+w;
dfs(v,u);
}
}
}
int A,B;
int lca(int a,int b) {
if(deep[a]<deep[b]) {
swap(a,b);
}
int lg=0;
for(;(1<<lg)<=deep[a];){
lg++;
}
lg--;
for(int i=lg;i>=0;i--){
if(deep[a]-(1<<i)>=deep[b]){
a=lp[a][i];
}
}
if(a==b)return a;
for(int i=lg;i>=0;i--){
if(lp[a][i] !=lp[b][i]){
a=lp[a][i];
b=lp[b][i];
}
}
A=a;
B=b;
return lp[a][0];
}
signed main(){
// freopen("P5236_1.in","r",stdin);
// freopen("P5236_1.ans","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>T;
sq_num=n;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,v});
}
Tarjan(1,-1);
dfs(1,-1);
while(T--){
A=B=0;
int u,v,ans=0;
cin>>u>>v;
int LCA=lca(u,v);
if(LCA<=n)ans=dis[u]+dis[v]-(dis[LCA]*2),cout<<ans<<endl;
else{
ans=dis[u]+dis[v]-dis[A]-dis[B];
if(sum[A]<sum[B])swap(A,B);
ans+=min(sum[A]-sum[B],sum[LCA]+sum[B]-sum[A]);
// ans=dis[u]-dis[A]+dis[v]-dis[B];
// ans+=min(abs(sum[A]-sum[B]),stot[A]-abs(sum[A]-sum[B]));
cout<<ans<<endl;
}
}
return 0;
}