45 problems solved
Rank by points: #18
Total points:
56
3 contests written
Rank by rating: #45
Rating: 1491
Min. rating: 1491
Max rating: 1604
From BOGOSORT
About
g++ main.cpp -o main && ./main
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pii;
typedef string bignum;
#define fi first
#define se second
const ll INF = 1e9 + 7;
const ll base = 1e6;
const int maxn = 1e4 + 5;
const ll MOD = 1e9 + 7;
const int special = 877;
int n,q;
vector<pii> adj[maxn];
ll f[maxn],h[maxn],up[maxn][20];
void dfs(int u,int p){
for (pii v : adj[u]) if (v.fi != p){
if (v.fi == up[u][0]) continue;
h[v.fi] = h[u] + 1;
f[v.fi] = f[u] + v.se;
up[v.fi][0] = u;
for (int j = 1; j < 20; j++){
up[v.fi][j] = up[up[v.fi][j - 1]][j - 1];
}
dfs(v.fi,u);
}
}
ll lca(int u,int v){
if (h[u] != h[v]){
if (h[u] < h[v]) swap(u,v);
int k = h[u] - h[v];
for (int j = 0; (1 << j) <= k; j++){
if (k >> j & 1) u = up[u][j];
}
}
if (u == v) return u;
int k = __lg(h[u]);
for (int j = k; j >= 0; j--){
if (up[u][j] != up[v][j]){
u = up[u][j], v = up[v][j];
}
}
return up[u][0];
}
ll res(int u,int v){
int p = lca(u,v);
return f[u] + f[v] - f[p] * 2;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i = 1; i < n; i++){
int a,b,c; cin >> a >> b >> c;
adj[a].push_back({b,c});
adj[b].push_back({a,c});
}
dfs(1,0);
// for (int i = 1; i <= n; i++) cout << f[i] << " ";
for (int i = 1; i <= q; i++){
int a,b; cin >> a >> b;
cout << res(a,b) << '\n';
}
return 0;
}
Rating history
, #