ez_lcw @ 2019-09-05 13:43:20
#include<bits/stdc++.h>
using namespace std;
long long ans=0x7f7f7f7f7f7f,s;
int n,sum[2000010],num[2000010],m,minn=0x7f7f7f7f,maxn=-0x7f7f7f;
struct data
{
int w,v;
}a[2000010];
struct node
{
int l,r;
}b[2000010];
long long work(long long a)
{
if(a<0)
{
return -a;
}
return a;
}
bool check(int w)
{
long long tot=0;
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1];
num[i]=num[i-1];
if(a[i].w>=w)
{
sum[i]+=a[i].v;
num[i]++;
}
}
for(int i=1;i<=m;i++)
{
tot+=(sum[b[i].r]-sum[b[i].l-1])*(num[b[i].r]-num[b[i].l-1]);
}
long long ans1=work(tot-s);
if(ans1<ans)
{
ans=ans1;
}
if(tot==s)
{
puts("0");
exit(0);
}
return tot>s;
}
int main()
{
scanf("%d%d%lld",&n,&m,&s);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].w,&a[i].v);
minn=min(minn,a[i].w);
maxn=max(maxn,a[i].w);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&b[i].l,&b[i].r);
}
int l=minn-10,r=maxn+10;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))
{
l=mid+1;
}else{
r=mid-1;
}
}
printf("%lld\n",ans);
return 0;
}
by ez_lcw @ 2019-09-05 13:43:36
WA90