#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
ll read() {
ll f = 1, x = 0;
char c = getchar();
while (c < '0' || '9' < c) {
if (c == '-')
f = -1;
c = getchar();
}
while ('0' <= c && c <= '9') {
x = (x << 1) + (x << 3) + c - '0';
c = getchar();
}
return x * f;
}
const ll inf = 0x3f3f3f3f3f3f3f3f;
const ll N = 2e5 + 5, M = 2e5 + 5, W = 1e6 + 5;
ll n, m, s, len;
ll w[N], v[N], b[N];
ll x[M], y[M];
vector<ll> C, V, L, R;
ll cnt = 0, root[N];
void makenode() {
C.push_back(0);
V.push_back(0);
L.push_back(0);
R.push_back(0);
}
void pushup(ll p) {
C[p] = C[L[p]] + C[R[p]];
V[p] = V[L[p]] + V[R[p]];
}
ll build(ll l, ll r) {
ll p = ++cnt;
makenode();
if (l == r) {
C[p] = V[p] = 0;
return p;
}
ll mid = (l + r) >> 1;
int Left = build(l, mid), Right = build(mid + 1, r);
L[p] = Left;
R[p] = Right;
pushup(p);
return p;
}
ll update(ll pre, ll l, ll r, ll k, ll q) {
ll p = ++cnt;
makenode();
if (l == k && k == r) {
C[p] = C[pre] + 1;
V[p] = V[pre] + q;
return p;
}
ll mid = (l + r) >> 1;
if (k <= mid) {
int Left = update(L[pre], l, mid, k, q);
L[p] = Left;
R[p] = R[pre];
} else {
int Right = update(R[pre], mid + 1, r, k, q);
L[p] = L[pre];
R[p] = Right;
}
pushup(p);
return p;
}
ll queryC(ll pre1, ll pre2, ll l, ll r, ll k) {
if (k <= l)
return C[pre1] - C[pre2];
ll mid = (l + r) >> 1, sum = 0;
sum += queryC(R[pre1], R[pre2], mid + 1, r, k);
if (k <= mid)
sum += queryC(L[pre1], L[pre2], l, mid, k);
return sum;
}
ll queryV(ll pre1, ll pre2, ll l, ll r, ll k) {
if (k <= l)
return V[pre1] - V[pre2];
ll mid = (l + r) >> 1, sum = 0;
sum += queryV(R[pre1], R[pre2], mid + 1, r, k);
if (k <= mid)
sum += queryV(L[pre1], L[pre2], l, mid, k);
return sum;
}
ll check(ll z) {
ll sum = 0;
for (ll i = 1; i <= m; i++) {
sum += queryC(root[y[i]], root[x[i] - 1], 1, len, z) *
queryV(root[y[i]], root[x[i] - 1], 1, len, z);
}
return sum;
}
int main() {
freopen("qc.in", "r", stdin);
freopen("qc.out", "w", stdout);
n = read(), m = read(), s = read();
for (ll i = 1; i <= n; i++) {
b[i] = w[i] = read(), v[i] = read();
}
sort(b + 1, b + n + 1);
len = unique(b + 1, b + n + 1) - (b + 1);
makenode();
root[0] = build(1, len);
for (ll i = 1; i <= n; i++) {
ll id = lower_bound(b + 1, b + len + 1, w[i]) - b;
root[i] = update(root[i - 1], 1, len, id, v[i]);
}
for (ll i = 1; i <= m; i++) {
x[i] = read(), y[i] = read();
}
ll l = 0, r = len, ans = inf;
while (l <= r) {
ll mid = (l + r) >> 1;
ll tmp = check(mid);
if (tmp < s) {
r = mid - 1;
if (s - tmp < ans)
ans = s - tmp;
} else {
l = mid + 1;
if (tmp - s < ans)
ans = tmp - s;
}
}
printf("%lld\n", ans);
return 0;
}