#include<bits/stdc++.h>
using namespace std;
long long n,d,k;
const int MAXN=500005;
long long x[MAXN],s[MAXN];
long long dp[MAXN];
bool check(int g){
long long l=max((long long)1,d-g),r=d+g,R=-1;
deque<long long> que;
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++){
if(x[i-1]+r<x[i]) break;
while(R+1<i && x[R+1]+l<=x[i]){
while(!que.empty() && dp[que.back()]<dp[R+1]) que.pop_back();
R++;
que.push_back(R);
}
while(!que.empty() && x[i]>x[que.front()]+r) que.pop_front();
if(!que.empty()) dp[i]=dp[que.front()]+s[i];
if(dp[i]>=k) return 1;
}
return 0;
}
int main(){
scanf("%lld%lld%lld",&n,&d,&k);
long long tot=0;
for(int i=1;i<=n;i++){
scanf("%lld%lld",&x[i],&s[i]);
if(s[i]>=0) tot+=s[i];
}
if(tot<k){
cout<<-1;
return 0;
}
int left=0,right=1e9;
while(left<right){
int mid=(left+right)>>1;
if(check(mid)){
right=mid;
}else{
left=mid+1;
}
}
cout<<left;
return 0;
}
https://www.luogu.com.cn/record/174183705