Submission #1359521

#TimeUsernameProblemLanguageResultExecution timeMemory
1359521julia_08Pictionary (COCI18_pictionary)C++20
140 / 140
60 ms20612 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2e5 + 10;

int dp[20][MAXN], dist[MAXN];

int val[MAXN], lc[MAXN], rc[MAXN];

int krt_pai[MAXN], dsu_pai[MAXN];

int krt_sz;

void init(int v, int t){

  dsu_pai[v] = krt_pai[v] = v;
  val[v] = t;

}

int get(int v){
  if(v == dsu_pai[v]) return v;
  return dsu_pai[v] = get(dsu_pai[v]);
}

void add(int a, int b, int t){

  a = get(a); b = get(b);

  if(a == b) return;

  krt_sz ++;
  init(krt_sz, t);

  lc[krt_sz] = a; rc[krt_sz] = b;

  dsu_pai[a] = dsu_pai[b] = krt_sz;
  krt_pai[a] = krt_pai[b] = krt_sz;

}

void dfs(int v, int d){

  if(!v) return;

  dist[v] = d;

  dfs(lc[v], d + 1);
  dfs(rc[v], d + 1);

}

int lca(int a, int b){

  if(dist[a] < dist[b]) swap(a, b);

  for(int k=0; k<20; k++){
    if((dist[a] - dist[b]) & (1 << k)){
      a = dp[k][a];
    }
  }

  if(a == b) return a;

  for(int k=19; k>=0; k--){
    if(dp[k][a] != dp[k][b]){
      a = dp[k][a];
      b = dp[k][b];
    }
  }

  return dp[0][a];

}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  int n, m, q; cin >> n >> m >> q;

  for(int i=1; i<=n; i++) init(i, 0);

  krt_sz = n;

  for(int i=1; i<=m; i++){

    int d = m - i + 1;

    for(int j=d; j<=(n - d); j+=d) add(j, j + d, i);

  }

  dfs(krt_sz, 0);
  
  for(int i=1; i<=krt_sz; i++) dp[0][i] = krt_pai[i];

  for(int k=1; k<20; k++){
    for(int i=1; i<=krt_sz; i++){
      dp[k][i] = dp[k - 1][dp[k - 1][i]];
    }
  }

  while(q--){
    int a, b; cin >> a >> b;
    cout << val[lca(a, b)] << "\n";
  }

  return 0;
}
#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...