虽然一眼看出是二分,但是还是连wa7次(喂,你自己不注意数据超int
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
#define ll long long
#define inf (1LL<<60)
ll n,m,p;
ll S; ll ans=inf;
ll l[200005],r[200005];
ll w[200005],v[200005];
ll sum[200005],cnt[200005];
ll cal(ll W)
{
ll tmp=0;
for(ll i=1;i<=n;i++)
{
sum[i]=sum[i-1];
cnt[i]=cnt[i-1];
if(w[i]>=W)
{
sum[i]+=v[i];
cnt[i]++;
}
}
for(ll i=1;i<=m;i++)
{
tmp+=(cnt[r[i]]-cnt[l[i]-1])*(sum[r[i]]-sum[l[i]-1]);
}
return tmp;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&S);
for(ll i=1;i<=n;i++) scanf("%lld%lld",&w[i],&v[i]),p=max(p,w[i]);
for(ll i=1;i<=m;i++) scanf("%lld%lld",&l[i],&r[i]);
ll l=0,r=p+1;
while(l<=r)
{
ll mid=(l+r)>>1;
ll t=cal(mid);
ans=min(ans,abs(t-S));
if(t<S)r=mid-1;
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}