제출 #1327923

#제출 시각아이디문제언어결과실행 시간메모리
1327923dmcs55Pictionary (COCI18_pictionary)C++20
140 / 140
55 ms22000 KiB
#include<bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
#define pf push_front
#define eb emplace_back
#define pob pop_back
#define pof pop_front
#define sz(x) (int)(x).size()
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define iBIT(x) ((x) ? 31 - __builtin_clz(x) : -1)
#define lBIT(x) ((x) ? 63 - __builtin_clzll(x) : -1)
using ll = long long;
template<class T> using vec = vector<T>;
template<class T> using prqm = priority_queue<T, vec<T>, greater<T>>;
template<class T> using prq = priority_queue<T>;

constexpr int mxn = 100005, mxl = 18;
vec<pair<int, int>> adj[mxn];
int n, m, q, up[mxn][mxl], mx[mxn][mxl], p[mxn], dep[mxn] = {};

inline int find(int x) {return (x == p[x]?x:p[x] = find(p[x]));}

inline void add(int a, int b, int w) {
	int ra = find(a), rb = find(b);
	if(ra^rb) {
		p[ra] = rb;
		adj[a].pb({b, w});
		adj[b].pb({a, w});
	}
}

void dfs(int u, int p1, int d, int w) {
	dep[u] = d+1, up[u][0] = p1, mx[u][0] = w;
	for(int i = 1; i < mxl; ++i) {
		up[u][i] = up[up[u][i-1]][i-1];
		mx[u][i] = max(mx[u][i-1],  mx[up[u][i-1]][i-1]);
	}
	for(pair<int, int> &e : adj[u]) if(e.fi^p1) dfs(e.fi, u, d+1, e.se);
}

inline int get(int a, int b) {
	if(dep[a] < dep[b]) swap(a, b);
	int d = dep[a]-dep[b], res = 0;
	for(int i = mxl-1; i >= 0; --i) {
		if(d>>i&1) {
			res = max(res, mx[a][i]);
			a = up[a][i];
		}
	}
	if(a==b) return res;
	for(int i = mxl-1; i >= 0; --i) {
		if(up[a][i] && up[a][i]^up[b][i]) {
			res = max({res, mx[a][i], mx[b][i]});
			a = up[a][i];
			b = up[b][i];
		}
	}
	return max({res, mx[a][0], mx[b][0]});
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> m >> q;
	iota(p+1, p+n+1, 1);
	
	for(int g = m; g >= 1; --g) {
		int d = m-g+1;
		for(int v = (g<<1); v <= n; v += g) add(g, v, d);
	}
	
	for(int i = 1; i <= n; ++i) if(dep[i] == 0) dfs(find(i), 0, 1, 0);
	
	while(q--) {
		int a, b;
		cin >> a >> b;
		
		if(find(a)^find(b)) continue;
		cout << get(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...