#include<bits/stdc++.h>
using namespace std;
int n,d,k;
int s[500010],f[500010];
int w[500010];
long long ll,rr;
int q(int a,int b)
{
if(a>b)
return a;
return b;
}
int fuck(int money)
{
ll=d-money;
rr=d+money;//当前金币下可跳的距离范围
if(ll<=0)
ll=1;//防止负数距离
for(int i=0;i<=n;++i)
{
w[i]=-1e6;//初始化
}
w[0]=0;//自己到第零个格子,也就是原点的得分为0
for(int i=1;i<=n;++i)
{
for(int j=i-1;j>=0;--j)
{
if(s[i]-s[j]<ll)//距离下个格子比最小可跳跃距离小,无法选中
continue;
if(s[i]-s[j]>rr)//距离下个格子的距离大于能跳跃的最大距离
break;
w[i]=q(w[i],w[j]+f[i]);//背包dp,比较当前状态和新状态的大小
if(w[i]>=k)
return 1;
}
}
return 0;
}
int main()
{
cin>>n>>d>>k;
for(int i=1;i<=n;++i)
cin>>s[i]>>f[i];
int l=0,r=s[n],z=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(fuck(mid))
{
z=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
cout<<z;
return 0;
}