Submission #1275378

#TimeUsernameProblemLanguageResultExecution timeMemory
1275378SmuggingSpunPictionary (COCI18_pictionary)C++20
140 / 140
268 ms2988 KiB
#include<bits/stdc++.h>
#define taskname "E"
using namespace std;
const int lim = 1e5 + 5;
int n, m, q, p[lim], xq[lim], yq[lim];
namespace sub1{
	int find_set(int N){
		return N == p[N] ? N : p[N] = find_set(p[N]);
	}
	void merge(int u, int v){
		if((u = find_set(u)) != (v = find_set(v))){
			p[u] = v;
		}
	}
	void solve(){
		iota(p + 1, p + n + 1, 1);
		vector<int>ans(q + 1, -1);
		for(int i = m; i > 0; i--){
			for(int j = i << 1; j <= n; j += i){
				merge(i, j);
			}
			for(int j = 1; j <= q; j++){
				if(ans[j] == -1 && find_set(xq[j]) == find_set(yq[j])){
					ans[j] = m - i + 1;
				}
			}
		}
		for(int i = 1; i <= q; i++){
			cout << ans[i] << "\n";
		}	
	}
}
namespace sub2{
	int w[lim], sz[lim];
	int find_set(int N){
		while(N != p[N]){
			N = p[N];
		}
		return N;
	}
	void merge(int u, int v, int t){
		if((u = find_set(u)) != (v = find_set(v))){
			if(sz[u] > sz[v]){
				swap(u, v);
			}
			w[u] = t;
			sz[p[u] = v] += sz[u];
		}
	}
	int get_max(int u, int v){
		int ans = 0;
		while(u != v){
			if(w[u] > w[v]){
				swap(u, v);
			}
			ans = w[u];
			u = p[u];
		}
		return ans;
	}
	void solve(){
		iota(p + 1, p + n + 1, 1);
		fill(sz + 1, sz + n + 1, 1);
		memset(w, 0x3f, sizeof(w));
		for(int i = m; i > 0; i--){
			for(int j = i << 1; j <= n; j += i){
				merge(i, j, m - i + 1);
			}
		}		
		for(int i = 1; i <= q; i++){
			cout << get_max(xq[i], yq[i]) << "\n";
		}
	}
}
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	if(fopen(taskname".inp", "r")){
		freopen(taskname".inp", "r", stdin);
	}
	cin >> n >> m >> q;
	for(int i = 1; i <= q; i++){
		cin >> xq[i] >> yq[i];
	}
	if(n <= 1000){
		sub1::solve();
	}
	else{
		sub2::solve();
	}
}

Compilation message (stderr)

pictionary.cpp: In function 'int main()':
pictionary.cpp:78:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |                 freopen(taskname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...