제출 #1359855

#제출 시각아이디문제언어결과실행 시간메모리
1359855jumpPictionary (COCI18_pictionary)C++20
140 / 140
64 ms45980 KiB
#include <bits/stdc++.h>
#define int long long
std::vector<std::pair<int,int>> adj[100100];
int dsu[100100];
int find(int a){
  if(dsu[a]==a)return a;
  else return dsu[a]=find(dsu[a]);
}
bool merge(int a,int b){
  int A = find(a);
  int B = find(b);
  if(A==B)return false;
  dsu[A]=B;return true;
}
int bilift[100100][23];
int weight[100100][23];
int depth[100100];
void dfs(int curr,int parr,int lw){
  depth[curr]=depth[parr]+1;
  bilift[curr][0]=parr;
  weight[curr][0]=lw;
  for(int i=1;i<=20;i++){
    bilift[curr][i]=bilift[bilift[curr][i-1]][i-1];
    weight[curr][i]=std::max(weight[curr][i-1],weight[bilift[curr][i-1]][i-1]);
  }
  for(auto [to,w]:adj[curr]){
    if(to==parr)continue;
    dfs(to,curr,w);
  }
}
int lca(int a,int b){
  if(a==b)return 0;
  int value=0;
  if(depth[a]>depth[b])std::swap(a,b);
  for(int i=20;i>=0;i--){
    if(depth[bilift[b][i]]>=depth[a]){
      value=std::max(weight[b][i],value);
      b=bilift[b][i];
    }
  }
  if(a==b)return value;
  for(int i=20;i>=0;i--){
    if(bilift[a][i]!=bilift[b][i]){
      value=std::max(weight[a][i],value);
      value=std::max(weight[b][i],value);
      a=bilift[a][i];
      b=bilift[b][i];
    }
  }
  value=std::max(weight[a][0],value);
  value=std::max(weight[b][0],value);
  return value;
}
signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n,m,q;
  std::cin >> n >> m >> q;
  for(int i=1;i<=n;i++)dsu[i]=i;
  for(int i=m;i>=1;i--){
    for(int j=i;j+i<=n;j+=i){
      if(merge(j,j+i)){
        adj[j].push_back({j+i,m-i+1});
        adj[j+i].push_back({j,m-i+1});
      }
    }
  }
  dfs(1,1,0);
  while(q--){
    int a,b;
    std::cin >> a >> b;
    std::cout << lca(a,b) << '\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...