#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int64_t d, k;
cin >> n >> d >> k;
vector<int64_t> x(n + 1, 0), s(n + 1, 0);
for (int i = 1; i <= n; i++)
{
cin >> x[i] >> s[i];
}
auto check = [&](const int64_t v) -> bool
{
vector<int64_t> dp(n + 1);
dp[0] = 0;
deque<int> q;
int pre_i = -1;
for (int i = 1; i <= n; i++)
{
while (!q.empty() && (x[i] - x[q.front()] < max(d - v, (int64_t)1) || x[i] - x[q.front()] > d + v))
{
q.pop_front();
}
while (pre_i + 1 <= n && x[i] - x[pre_i + 1] >= max(d - v, (int64_t)1) && x[i] - x[pre_i + 1] <= d + v)
{
while (!q.empty() && dp[pre_i + 1] > dp[q.back()])
{
q.pop_back();
}
q.push_back(pre_i + 1);
pre_i++;
}
if (q.empty())
{
dp[i] = -0x3f3f3f3f3f3f3f3f;
}
else
{
dp[i] = s[i] + dp[q.front()];
}
}
return *max_element(++dp.begin(), dp.end()) >= k;
};
int64_t left = 0, right = 1e11;
int64_t ans = -1;
while (left <= right)
{
int64_t mid = (left + right) / 2;
if (check(mid))
{
ans = mid;
right = mid - 1;
}
else
{
left = mid + 1;
}
}
cout << ans;
return 0;
}