Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Min Max LCA
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- const int mod = 1e9 + 7;
- const int N = 1e5 + 10;
- vector<pair<int,int>> edge[N];
- int par[N],lev[N],table[N][18],Mn[N][18],Mx[N][18],cst[N];
- void CLEAR() {
- for(int i = 0; i < N; i++) {
- edge[i].clear();
- for(int j = 0; j < 18; j++) {
- table[i][j] = -1;Mn[i][j] = 1e9,Mx[i][j] = -1e9;
- }
- }
- }
- void dfs(int s,int p,int l,int c = 0) {
- par[s] = p;
- lev[s] = l;
- cst[s] = c;
- for(auto it : edge[s]) {
- if(it.first == p) continue;
- dfs(it.first,s,l+1,it.second);
- }
- }
- void lca_init(int n) {
- for(int i = 1; i <= n; i++) {
- table[i][0] = par[i];
- Mx[i][0] = Mn[i][0] = cst[i];
- }
- for(int i = 1; i < 18; i++) {
- for(int j = 1; j <= n; j++) {
- if(table[j][i-1] != -1) {
- Mx[j][i] = max(Mx[table[j][i-1]][i-1],Mx[j][i-1]);
- Mn[j][i] = min(Mn[table[j][i-1]][i-1],Mn[j][i-1]);
- table[j][i] = table[table[j][i-1]][i-1];
- }
- }
- }
- }
- pair<int,int> lca_query(int u,int v) {
- if(lev[u] > lev[v]) swap(u,v);
- int mx = -1e9,mn = 1e9;
- for(int i = 17; i >= 0; i--) {
- if(table[v][i] == -1) continue;
- int pp = table[v][i];
- if(lev[pp] >= lev[u]) {
- mn = min(mn,Mn[v][i]);
- mx = max(mx,Mx[v][i]);
- v = table[v][i];
- }
- }
- if(u == v) {
- return {mn,mx};
- }
- for(int i = 17; i >= 0; i--) {
- int uu = table[u][i];
- int vv = table[v][i];
- if(uu == -1 || vv == -1) continue;
- if(uu != vv) {
- mx = max(mx,max(Mx[u][i],Mx[v][i]));
- mn = min(mn,min(Mn[u][i],Mn[v][i]));
- u = uu;
- v = vv;
- }
- }
- mx = max(mx,max(Mx[u][0],Mx[v][0]));
- mn = min(mn,min(Mn[u][0],Mn[v][0]));
- return {mn,mx};
- }
- int main() {
- ios_base::sync_with_stdio(0); cin.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- int t;
- scanf("%d",&t);
- int ajinka = 1;
- while(t--) {
- int n;
- scanf("%d",&n);
- CLEAR();
- for(int i = 0; i < n-1; i++) {
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- edge[u].push_back({v,w});
- edge[v].push_back({u,w});
- }
- dfs(1,-1,0);
- lca_init(n);
- int q;
- scanf("%d",&q);
- printf("Case %d:\n",ajinka++);
- while(q--) {
- int xx,yy;
- scanf("%d%d",&xx,&yy);
- pair<int,int> ans = lca_query(xx,yy);
- printf("%d %d\n",ans.first,ans.second);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement