rt
expected:−544327979208 found:−504604156303
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define rint register int
using namespace std;
namespace IO{
#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
#define FileClose() fclose(stdin),fclose(stdout)
inline int read(){
int w=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){w=(w<<3)+(w<<1)+(ch^48); ch=getchar();}
return w*f;
}
inline void write(int x,char ch='\n'){
static int sta[35]; int top=0;
if(x<0) putchar('-'),x=-x;
do{sta[++top]=x%10,x/=10;}while(x);
while(top) putchar(sta[top--]+48); putchar(ch);
}
}
using namespace IO;
namespace CL{
#define fill(x,y) memset(x,y,sizeof(x))
#define copy(x,y) memcpy(x,y,sizeof(y))
const int maxn=3e5+5; const ll inf=0x7ffffffffffffff;
int n,s,tot;
ll T[maxn],C[maxn],x[maxn],lsh[maxn],f[maxn];
namespace SegmentTree{
#define lson p<<1
#define rson p<<1|1
struct node{
ll k,b;
node(){} node(ll x,ll y){k=x,b=y;}
inline ll calc(ll x){return k*lsh[x]+b;}
}t[maxn<<2];
inline bool cover(node org,node now,ll x){
return now.calc(x)<=org.calc(x);
}
void build(int p,int l,int r){
t[p].k=0,t[p].b=inf;
if(l==r) return;
int mid=(l+r)>>1;
build(lson,l,mid),build(rson,mid+1,r);
}
void insert(int p,int l,int r,node k){
if(cover(t[p],k,l) && cover(t[p],k,r)) return t[p]=k,void();
if(l==r) return;
int mid=(l+r)>>1;
if(cover(t[p],k,mid)) swap(t[p],k);
if(cover(t[p],k,l)) insert(lson,l,mid,k);
if(cover(t[p],k,r)) insert(rson,mid+1,r,k);
}
ll query(int p,int l,int r,ll x){
if(l==r) return t[p].calc(x);
int mid=(l+r)>>1; ll res;
if(x<=mid) res=query(lson,l,mid,x);
else res=query(rson,mid+1,r,x);
return min(res,t[p].calc(x));
}
}using namespace SegmentTree;
inline int main(){
n=read(); s=read();
for(int i=1;i<=n;i++) T[i]=read()+T[i-1],C[i]=read()+C[i-1],lsh[i]=x[i]=T[i];
sort(lsh+1,lsh+1+n);
tot=unique(lsh+1,lsh+1+n)-lsh-1;
build(1,1,n);
for(int i=1;i<=n;i++){
x[i]=lower_bound(lsh+1,lsh+1+tot,x[i])-lsh;
f[i]=min(query(1,1,n,x[i])+T[i]*C[i]+s*C[n],T[i]*C[i]+s*C[n]);
insert(1,1,n,node(-C[i],f[i]-s*C[i]));
}
printf("%lld\n",f[n]);
return 0;
}
}
signed main(){return CL::main();}