## poj3779(二分答案）

Corral the Cows
 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1196 Accepted: 502

Description

Farmer John wishes to build a corral for his cows. Being finicky beasts, they demand that the corral be square and that the corral contain at least C (1 <= C <= 500) clover fields for afternoon treats. The corral's edges must be parallel to the X,Y axes.

FJ's land contains a total of N (C <= N <= 500) clover fields, each a block of size 1 x 1 and located at with its lower left corner at integer X and Y coordinates each in the range 1..10,000. Sometimes more than one clover field grows at the same location; such a field would have its location appear twice (or more) in the input. A corral surrounds a clover field if the field is entirely located inside the corral's borders.

Help FJ by telling him the side length of the smallest square containing C clover fields.

Input

Line 1: Two space-separated integers: C and N

Lines 2..N+1: Each line contains two space-separated integers that are the X,Y coordinates of a clover field.

Output

Line 1: A single line with a single integer that is length of one edge of the minimum size square that contains at least C clover fields.

Sample Input

```3 4
1 2
2 1
4 1
5 2```

Sample Output

`4`

Hint

Explanation of the sample:

```|*   *
| * *
+------```
Below is one 4x4 solution (C's show most of the corral's area); many others exist.

```|CCCC
|CCCC
|*CCC*
|C*C*
+------```

Source

```#include<cstdio>
#include<algorithm>
using namespace std;

struct my{
int x,y;
};

my a;
int mid;
int tmp;
int c,n;

bool cmp(const my &a,const my &b){
return a.x<b.x;
}

bool judge(int l,int r)
{
int cnt=0;
for(int i=l; i<=r; ++i) tmp[++cnt]=a[i].y;
sort(tmp+1,tmp+cnt+1);
for(int i=c; i<=cnt; ++i)
if(tmp[i]-tmp[i-c+1]<=mid) return 1;
return 0;
}
bool check(int x)
{
int l=1,r=1;
for(; r<=n; ++r)
{
if(a[r].x-a[l].x>x)
if(judge(l,r-1)) return 1;
for(; a[r].x-a[l].x>x; ) l++;
}
return judge(l,n);
}
int main(){
int x,y;
scanf("%d%d",&c,&n);
for (int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
a[i].x=x;
a[i].y=y;
}
sort(a+1,a+1+n,cmp);
int l=0,r=10000;
int ans=0;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)){
r=mid-1;
ans=mid+1;
}
else l=mid+1;
}
printf("%d",ans);
return 0;
}```