You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.2 KiB
C++
40 lines
1.2 KiB
C++
#include <cstdio>
|
|
#include <cinttypes>
|
|
inline int64_t min(int64_t a, int64_t b) { return a < b ? a : b; }
|
|
inline int64_t abs(int64_t a) { return a > 0 ? a : -a; }
|
|
int32_t n, m;
|
|
int64_t S;
|
|
struct { int32_t w, v; } sto[200001];
|
|
struct { int32_t l, r; } inv[200001];
|
|
int64_t sum[200001];
|
|
int32_t cnt[200001];
|
|
int64_t check(int64_t T)
|
|
{
|
|
for (int32_t i = 1; i <= n; i++)
|
|
{
|
|
cnt[i] = cnt[i - 1], sum[i] = sum[i - 1];
|
|
if (sto[i].w >= T) cnt[i]++, sum[i] += sto[i].v;
|
|
}
|
|
int64_t ret = 0;
|
|
for (int32_t i = 1; i <= m; i++)
|
|
ret += (cnt[inv[i].r] - cnt[inv[i].l - 1])*(sum[inv[i].r] - sum[inv[i].l - 1]);
|
|
return ret;
|
|
}
|
|
int main()
|
|
{
|
|
scanf("%" SCNd32 "%" SCNd32 "%" SCNd64, &n, &m, &S);
|
|
for (int32_t i = 1; i <= n; i++)
|
|
scanf("%" SCNd32 "%" SCNd32, &sto[i].w, &sto[i].v);
|
|
for (int32_t i = 1; i <= m; i++)
|
|
scanf("%" SCNd32 "%" SCNd32, &inv[i].l, &inv[i].r);
|
|
int64_t ans = INT64_MAX >> 1;
|
|
for (int64_t l = -1, r = INT64_MAX >> 1, mid, tmp; l < r;)
|
|
{
|
|
mid = (l + r) >> 1;
|
|
ans = min(ans, abs(S - (tmp = check(mid))));
|
|
if (tmp >= S) l = mid + 1;
|
|
else r = mid;
|
|
}
|
|
printf("%" PRId64, ans);
|
|
return 0;
|
|
} |