Files
luogu/P1314.cpp
T
2026-07-19 18:29:19 +08:00

72 lines
1.6 KiB
C++

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, s;
struct k
{
int w, v;
} kuang[200005];
struct q
{
int l, r;
} qu[200005];
int precnt[200005], pre[200005];
/*
大于W的数量*大于W的v的和
*/
int query(int w)
{
memset(precnt, 0, sizeof precnt);
memset(pre, 0, sizeof pre);
int ans = 0;
for (int i = 1; i <= n; ++i)
{
if (kuang[i].w > w)
pre[i] = pre[i - 1] + kuang[i].v, precnt[i] = precnt[i - 1] + 1;
else
pre[i] = pre[i - 1], precnt[i] = precnt[i - 1];
}
for (int i = 1; i <= m; ++i)
{
int cnt = precnt[qu[i].r] - precnt[qu[i].l - 1], sumv = pre[qu[i].r] - pre[qu[i].l - 1];
// for (int j = qu[i].l; j <= qu[i].r; ++j)
// {
// if (kuang[j].w > w)
// cnt++, sumv += kuang[j].v;
// }
ans += cnt * sumv;
}
return ans - s;
}
signed main()
{
scanf("%lld%lld%lld", &n, &m, &s);
int maxwj = 0;
for (int i = 1; i <= n; ++i)
{
scanf("%lld%lld", &kuang[i].w, &kuang[i].v);
maxwj = max(maxwj, kuang[i].w);
}
for (int i = 1; i <= m; ++i)
scanf("%lld%lld", &qu[i].l, &qu[i].r);
int l = 0, r = LONG_LONG_MAX, mid;
int ans = LONG_LONG_MAX;
while (l <= r)
{
mid = (l + r) / 2;
if (query(mid) < 0)
r = mid - 1;
else
l = mid + 1;
ans = min(abs(query(mid)), ans);
}
printf("%lld\n", ans);
/*
int mina = INT_MAX;
for (int i = 0; i <= r; ++i)
{
mina = min(mina, abs(query(i)));
}
printf("%d\n", mina);*/
return 0;
}