#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define stop exit(0) #define nc -1 #define eps 1e-10 #define inf 1000000000 #define mod 1000000007 #define mp make_pair #define MAXN 100100 #define fill(array,value) memset(array,value,sizeof(array)) #define f(i,beg,end) for(int i=beg; i<=end; i++) #define F(i,beg,end) for(int i=beg; i>=end; i--) #define Max(a,b) ( (a>b)?a:b ) #define Min(a,b) ( (a NOT_FOUND = make_pair(LOW_POINT,HIGH_POINT); int n; point p[MAXN]; bool xcmp(point a, point b) { return a.x < b.x; } bool ycmp(int a, int b) { return p[a].y < p[b].y; } pair < point, point > cpsolve(int a[MAXN], int L, int R) { int i, j, k, n = R-L, mid = (L+R)>>1; if (n<=1) return NOT_FOUND; if (n==2) return mp(p[a[0]],p[a[1]]); int b[MAXN]; for(i = k = 0, j = mid - L; k < n; k++) if(a[k] <= mid && i < (mid-L)) b[i++] = a[k]; else b[j++] = a[k]; pair < point, point > ans, a1 = cpsolve(b,L,mid), b1 = cpsolve(b+mid-L, mid+1, R); if (myDistance(a1.first,a1.second) < myDistance(b1.first,b1.second)) { ans = a1; } else { ans = b1; } /* combine */ int f[MAXN], t = 0; for(k = 0; k < n; k++) if(fabs(p[a[k]].x - p[mid].x) - myDistance(ans.first,ans.second) < EPS) f[t++] = a[k]; for(i = 0; i < t-1; i++) { for(j = min(i+7, t-1); j > i; j--) { double d = myDistance(p[f[i]], p[f[j]]); if(d < myDistance(ans.first,ans.second)) ans = mp(p[f[i]], p[f[j]]); } } return ans; } pair < point, point > closestpair() { int a[MAXN]; f(i,0,n-1) a[i] = i; sort(p, p+n, xcmp); sort(a, a+n, ycmp); return cpsolve(a, 0, n); } int main() { // input("test.txt"); input("robot.in"); output("robot.out"); int jj1, jj2; scanf("%d%d%d", &jj1, &jj2, &n); { f(i,0,n-1) scanf("%lf %lf", &p[i].x, &p[i].y); pair ans = (closestpair()); if(ans == NOT_FOUND) { printf("Something went terribly wrong...\n"); } else { int answ = myDistance(ans.first,ans.second); printf("%d\n",answ); // cout << ans.first.x << " " << ans.first.y << " -- " << ans.second.x << " " << ans.second.y << endl; } } return 0; }