#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; #define MAX 32768 #define INF 1100000000 pii opt[2*MAX]; pii get(int lo){ if(lo >= MAX)return mp(INF , INF); lo += MAX; pii ret = opt[lo]; for(;;){ int plo = lo>>1; if(plo == 0)break; if(2*plo == lo) relaxMin(ret , opt[lo+1]); lo = plo; } return ret; } void push(int lo , pii what){ if(lo >= MAX)return; lo += MAX; opt[lo] = what; for(;;){ int plo = lo>>1; if(plo == 0)break; opt[plo] = min(opt[plo<<1] , opt[(plo<<1) + 1]); lo = plo; } } int N , M , K; vector in; vi idx; bool compare(const int& f , const int& s){ return in[f] < in[s]; } bool can_kill(int how){ vector act; for(int i=0;i0;--i) opt[i] = min(opt[2*i] , opt[2*i+1]); int need = 0; int lx; for(;;){ lx = 0; pii use = get(lx); if(use.fi >= INF)break; ++need; if(need > K)return false; for(;;){ if(use.fi >= INF) break; lx = lower_bound(all(act) , mp(use.se , use.fi)) - act.begin(); push(lx , mp(INF , INF)); use = get(lx); } } return true; } int main(){ freopen("robots.in" , "r" , stdin); freopen("robots.out" , "w" , stdout); scanf("%d%d%d" , &N , &M , &K); in.resize(N); for(int i=0;i= hi){ if(can_kill(hi))mid = hi; else mid = lo; break; } mid = (lo+hi)>>1; if(can_kill(mid))lo = mid; else hi = mid; } printf("%d\n" , mid); return 0; }