RT
#include<bits/stdc++.h>
#define mininum -10000000000000000
#define int long long
using namespace std;
int n,d,k,x[1000005],s[1000005],total,l,r,mid,ans,f[100005];
struct node {
int p,val;
};
deque<node>q;
bool check(int num) {
int res=0,ri=0,Max=num+d,Min=max((long long)1,d-num);
for(int i=1;i<=n;i++)f[i]=mininum;
q.clear();
q.push_front((node){
0,0
});
for(int i=1; i<=n; i++) {
if(x[i]<Min&&q.front().p==0)continue;
while(!q.empty()&&x[i]-q.back().p>Max)q.pop_back();
while(x[i]-x[ri+1]>=Min) {
ri++;
if(f[ri]==mininum||x[i]-x[ri]>Max)continue;
while(!q.empty()&&f[ri]>=q.front().val)q.pop_front();
q.push_front((node) {
x[ri],f[ri]
});
}
if(!q.empty())f[i]=s[i]+q.back().val;
res=max(res,f[i]);
}
return (res>=k);
}
signed main() {
freopen("1.in","r",stdin);
scanf("%lld%lld%lld",&n,&d,&k);
for(int i=1; i<=n; i++)
scanf("%lld%lld",&x[i],&s[i]),total+=(s[i]>0?s[i]:0);
if(total<k) {
puts("-1");
return 0;
}
l=0,r=2e9;
while(r>=l) {
mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld\n",ans);
}