交上去报蛋,但是手测是对的...
#include<bits/stdc++.h>
using namespace std;
long long n,i,l,r,d,k,w[500010],s[500010],q[500010],f[500010],mid;
long long ans;
void clean(long long a,long long b){
long long i;
for(i=a;i<=b;i++){
q[i]=0;
}
}
long long max(long long x,long long y){
if(x>y)return x;
else return y;
}
bool check(long long x){
int head=1,tail=1,i;
q[1]=0;
for(i=1;i<=n;i++){
while(head<=tail&&w[i]-w[q[head]]>d+x){
q[head++]=0;
}
if(head>tail)return 1;
if(w[i]-w[q[head]]>=max(1,d-x))f[i]=f[q[head]]+s[i];
else continue;
if(f[i]>=k){
// cout<<f[i]<<endl;
clean(head,tail);
return 0;
}
q[++tail]=i;
while(f[q[tail]]>=f[q[tail-1]]&&tail>head){
q[tail-1]=q[tail--];
}
// cout<<f[i]<<' '<<d+x<<' '<<max(1,d-x)<<' '<<q<<endl;
}
clean(head,tail);
return 1;
}
int main(){
// freopen("jump.in","r",stdin);
// freopen("jump.out","w",stdout);
scanf("%lld%lld%lld",&n,&d,&k);
for(i=1;i<=n;i++){
scanf("%lld%lld",&w[i],&s[i]);
}
// l=r=99;
l=0;r=max(d,w[n]);ans=-1;
// cout<<l<<' '<<r<<endl;
while(l<=r){
mid=(l+r)/2;
// if(mid==101)mid=1;
// cout<<endl<<mid<<endl;
if(check(mid))l=mid+1;
else{
// cout<<mid<<endl;
ans=mid;
r=mid-1;
}
}
printf("%lld",ans);
return 0;
}