rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,d,k,f[500005],maxdis=LLONG_MIN;
struct node{
int dis,score;
}a[500005];
bool check(int g){
deque<int>q;
int pi=0;
a[0].dis=0,a[0].score=0;
f[0]=0;
for(int i=1;i<=n;i++){
while((!q.empty())&&(a[i].dis>a[q.front()].dis+d+g))q.pop_front();
while((pi<i)&&(a[pi].dis+max(1ll,d-g)<=a[i].dis)&&(a[i].dis<=a[pi].dis+d+g)){
if(f[pi]==LLONG_MIN){
pi++;
continue;
}
while((!q.empty())&&(f[pi]>=f[q.back()]))q.pop_back();
q.push_back(pi);
pi++;
}
if(q.empty())f[i]=LLONG_MIN;
else f[i]=f[q.front()]+a[i].score;
if(f[i]>=k)return true;
}
return false;
}
int fun(){
int ans=0;
for(int i=1;i<=n;i++)if(a[i].score>0)ans+=a[i].score;
if(ans<k)return -1;
int l=0,r=1e9+7,mid;
while(l<=r){
mid=(l+r)/2;
if(check(mid))r=mid-1;
else l=mid+1;
}
return l;
}
void read(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>d>>k;
for(int i=1;i<=n;i++){
cin>>a[i].dis>>a[i].score;
maxdis=max(maxdis,a[i].dis);
}
}
signed main(){
read();
cout<<fun();
return 0;
}