#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define X first
#define Y second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <int, pii> pip;
const int INF=0x3f3f3f3f;
const int N=1e5+5;
int n, m, q;
pii queries[N];
vector <pip> v[N], vn[N]; //za svaki mid unutra je par <index, <lo, hi> >
vector <pii> dan[N];
int P[N], sol[N];
int name(int x) {
if (x==P[x]) return x;
P[x]=name(P[x]);
return P[x];
}
void mrg(int x, int y) {
x=name(x); y=name(y);
if (x==y) return;
P[x]=y;
}
void load() {
scanf("%d %d %d", &n, &m, &q);
for (int i=0; i<q; ++i) {
int a, b;
scanf("%d %d", &a, &b);
queries[i]=mp(a, b);
v[m/2].pb(mp(i, mp(1, m-1)));
}
}
void solve() {
for (int i=2; i<=m; ++i) {
for (int j=i*2; j<=n; j+=i) {
dan[m-i+1].pb(mp(i, j));
//printf("\n");
}
}
// for (int i=1; i<m; ++i) {
// printf("dan == %d: ", i);
// for (pii p:dan[i]) printf("<%d, %d> ", p.X, p.Y);
// printf("\n");
// }
while (1) {
int cnt=0;
for (int i=1; i<=n; ++i) P[i]=i;
for (int i=1; i<m; ++i) {
for (pii pp:dan[i]) mrg(pp.X, pp.Y);
for (pip p:v[i]) {
int x=queries[p.X].X, y=queries[p.X].Y;
//printf("mid == %d, query: <%d, %d>, lo == %d, hi == %d\n", i, x, y, p.Y.X, p.Y.Y);
int lo, hi, mid;
if (name(x)==name(y)) {
lo=p.Y.X; hi=i;
}
else {
lo=i+1; hi=p.Y.Y;
}
//printf("novi lo == %d, hi == %d\n", lo, hi);
mid=(lo+hi)/2;
if (lo==hi) {
sol[p.X]=lo;
}
else {
vn[mid].pb(mp(p.X, mp(lo, hi)));
++cnt;
}
}
v[i].clear();
}
if (cnt==0) break;
for (int i=1; i<m; ++i) {
for (pip pp:vn[i]) v[i].pb(pp);
vn[i].clear();
}
}
for (int i=0; i<q; ++i) {
if (sol[i]==m-1) {
if (name(queries[i].X)==name(queries[i].Y)) printf("%d\n", m-1);
else printf("%d\n", m);
}
else printf("%d\n", sol[i]);
}
}
int main() {
load();
solve();
return 0;
}
Compilation message
pictionary.cpp: In function 'void load()':
pictionary.cpp:39:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d", &n, &m, &q);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
pictionary.cpp:42:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &a, &b);
~~~~~^~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
11 ms |
8440 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
20 ms |
11424 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
55 ms |
23792 KB |
Output is correct |
2 |
Correct |
45 ms |
18408 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
131 ms |
29884 KB |
Output is correct |
2 |
Correct |
62 ms |
25124 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
113 ms |
28408 KB |
Output is correct |
2 |
Correct |
102 ms |
26640 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
141 ms |
31912 KB |
Output is correct |
2 |
Correct |
107 ms |
25296 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
215 ms |
42596 KB |
Output is correct |
2 |
Correct |
166 ms |
31828 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
122 ms |
26344 KB |
Output is correct |
2 |
Correct |
297 ms |
49300 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
394 ms |
58068 KB |
Output is correct |
2 |
Correct |
432 ms |
52968 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
433 ms |
66560 KB |
Execution killed with signal 9 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |