#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define int long long
const int INF=0x7f7f7f7f7f7f7f7f;
const int N=5e5+10;
struct inpt{
int x,s;
}v[N];
struct node{
int val,pos;
};
deque<node> q;
int f[N];
int n,d,k,ans=-1;
bool check(int g){
int tmp=-INF;
q.clear();
int lgest=g+d,shest=max(d-g,1ll);
f[0]=0;
int j=0;
for(int i=1;i<=n;i++){
f[i]=-INF;
while(!q.empty()&&v[i].x-lgest>q.front().pos) q.pop_front();
while(j<i&&v[i].x-shest>=v[j].x){
if(f[j]==-INF){
j++;
continue;
}
while(!q.empty()&&f[j]>q.back().val) q.pop_back();
q.push_back({f[j],v[j].x});
f[i]=max(f[i],q.front().val+v[i].s);
j++;
}
if(!q.empty()&&q.front().val!=-INF) f[i]=q.front().val+v[i].s;
tmp=max(tmp,f[i]);
}
return tmp>=k;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>d>>k;
for(int i=1;i<=n;i++){
cin>>v[i].x>>v[i].s;
}
int l=0,r=N;
while(l<=r){
int mid=(l+r)/2;
if(check(mid)){
r=mid-1;
ans=mid;
}else{
l=mid+1;
}
}
cout<<ans;
return 0;
}