#ifdef _WIN32 # define LL "%I64d" #else # define LL "%Ld" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define null NULL #define mp make_pair #define pb(a) push_back(a) #define sz(a) ((int)(a).size()) #define all(a) a.begin() , a.end() #define fi first #define se second #define relaxMin(a , b) (a) = min((a),(b)) #define relaxMax(a , b) (a) = max((a),(b)) #define SQR(a) ((a)*(a)) typedef vector vi; typedef pair pii; typedef long long ll; // Bit #define MAX 100010 int sum[MAX]; void add(int pos , int how){ ++pos; for(;pos < MAX; pos += pos&(-pos)) sum[pos] += how; } int get(int fr , int to){ ++fr , ++to; int ret = 0; for(;to>0;to -= to&(-to)) ret += sum[to]; --fr; for(;fr>0;fr -= fr&(-fr)) ret -= sum[fr]; return ret; } // end int N , M , K; vector pts; vi Y; int up(int pos , int dlt){ return lower_bound(all(Y) , pos + dlt + 1) - Y.begin() - 1; } int down(int pos , int dlt){ return lower_bound(all(Y) , pos - dlt) - Y.begin(); } bool can(int how){ memset(sum , 0 , sizeof sum); int Last = 0; for(int i=0;i how){ add(down(pts[Last].se , 0) , -1); ++Last; } if(get(down(pts[i].se , how) , up(pts[i].se , how)) > 0) return true; add(down(pts[i].se , 0) , +1); } return false; } int main(){ freopen("robot.in" , "r" , stdin); freopen("robot.out" , "w" , stdout); scanf("%d%d%d" , &N , &M , &K); //N = M = K = 100000; pts.resize(K); for(int i=0;i= hi){ if(can(lo)) mid = lo; else mid = hi; break; } mid = (lo+hi)>>1; if(can(mid)) hi = mid; else lo = mid; } cout<