测试点7,8,9,10,11,13未通过TAT
#include<iostream>
#include<cmath>
using namespace std;
int n,m;
long long s;
int w[200005],v[200005],l[200005],r[200005];
long long pre_n[20005],pre_v[200005];
long long calcu_y(int w0){
long long y0=0;
for(int i=1;i<=n;i++){//计算前缀和
if(w[i]>w0){
pre_n[i]=pre_n[i-1]+1;
pre_v[i]=pre_v[i-1]+v[i];
}else{
pre_n[i]=pre_n[i-1];
pre_v[i]=pre_v[i-1];
}
}
for(int i=1;i<=m;i++){
y0+=(pre_n[r[i]]-pre_n[l[i]-1])*(pre_v[r[i]]-pre_v[l[i]-1]);
}
return y0;
}
void DIGUI(int w1,int w2){//y关于W单调递减,w1<w2,y1>=s>y2
if(w2-w1<=1){
long long y1=calcu_y(w1),y2=calcu_y(w2);
cout<<min(y1-s,s-y2);
return;
}
int wmid=(w1+w2)/2;
if(calcu_y(wmid)<s){
DIGUI(w1,wmid);
}else{
DIGUI(wmid,w2);
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=m;i++){
cin>>l[i]>>r[i];
}
int wmin=w[1],wmax=w[1];
for(int i=2;i<=n;i++){
if(w[i]<wmin)wmin=w[i];
if(w[i]>wmax)wmax=w[i];
}
DIGUI(wmin,wmax+1);
return 0;
}