#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(v) v.begin(),v.end() using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; const ld epsylon = 1e-9; typedef unsigned long ui; long absMy(long X) { if (X < 0) return -X; return X; } long maxMy(long A, long B) { return A>B?A:B; } long minMy(long A, long B) { return A P, long n) { long mina = 1000000002; for (long i = 0; i < n; ++i) for (long j = i+1; j < n; ++j) if (disto(P[i], P[j]) < mina) mina = disto(P[i], P[j]); return mina; } long stripClosest(vector strip, long sized, long d) { long mina = d; sort(all(strip), myobject); for (long i = 0; i < sized; ++i) for (long j = i+1; j < sized && (strip[j].y - strip[i].y) < mina; ++j) if (disto(strip[i],strip[j]) < mina) mina = disto(strip[i], strip[j]); return mina; } long closestUtil(vector P, long n) { if (n <= 3) return bruteForce(P, n); long mid = n/2; Pointtt midPointtt = P[mid]; vector F, S; for (long i = 0; i < n; ++i) { if (i < mid) F.push_back(P[i]); else S.push_back(P[i]); } long dl = closestUtil(F, mid); long dr = closestUtil(S, n-mid); long d = minMy(dl, dr); vector strip; long j = 0; for (long i = 0; i < n; i++) if (absMy(P[i].x - midPointtt.x) < d) { strip[j] = P[i]; j++; } return minMy(d, stripClosest(strip, j, d) ); } long KK; long closest1(vector P, long n) { sort(all(P)); return closestUtil(P, n); } int main() { freopen("robot.in","r",stdin); freopen("robot.out","w",stdout); //program long n,m,k; cin >> n >> m >> k; KK=k; vector PTS; for (long i = 0; i < k; ++i) { Pointtt s; cin >> s.x>>s.y; PTS.push_back(s); } cout << closest1(PTS, k) << endl; return 0; }