https://www.luogu.com.cn/record/200441462
#include<bits/stdc++.h>
using namespace std;
#define int __int128_t
//#define ONLINE_JUDGE IO_copyright_Komeijizen_all_rights_reserved
namespace IO{
char ibuf[(1<<20)+1],*iS,*iT;
#if ONLINE_JUDGE
#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
#else
#define gh() getchar()
#endif
inline int read()
{
char ch=gh();
int x=0;
bool t=0;
while(ch<'0'||ch>'9') t|=ch=='-',ch=gh();
while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
return t?-x:x;
}
inline void write(int k,bool b=1)
{
if(k==0&&b==0)return;
if(k<0)
{
putchar('-');
write(-k,1);
}
else
{
write(k/10,0);
putchar('0'+k%10);
}
}
}
using namespace IO;
#define y1 asdgniladfnli
#define y2 aslkjdhnasgfld
int n,l,d[114514],t[114514],sum1[114514],sum2[114514],t1,t2,t3,t4,dp[114514][5],y,k,x,b;
int x1,y1,x2,y2,x3,y3,ans;
struct xy
{
int x,y;
}te;
int q[1145141],ll,rr;
inline int X(int x)
{
return sum1[x];
}
inline int Y(int x,int y)
{
return (dp[x][y-1]-sum2[x]+l*sum1[x]);
}
signed main()
{
n=read();l=read();
for(int i=1;i<=n;++i)
{
d[i]=read();
t[i]=read();
}
if(d[n]!=l)
{
d[++n]=l;
t[n]=0;
}
for(int i=1;i<=n;++i)
{
sum1[i]=sum1[i-1]+t[i];
sum2[i]=sum2[i-1]+(l-d[i])*t[i];
}
for(int i=1;i<=n;++i)
{
dp[i][1]=dp[0][0]+sum2[i-1]-(l-d[i])*(sum1[i-1]);
}
for(int j=2;j<=4;++j)
{
ll=1,rr=0;
memset(q,0,sizeof q);
for(int i=0;i<=n;++i)dp[i][j]=0x3f3f3f3f;
for(int i=1;i<=n;++i)
{
while(rr>ll&&Y(q[ll+1],j)-Y(q[ll],j)<=d[i]*(X(q[ll+1])-X(q[ll])))ll++;
k=q[ll];
dp[i][j]=dp[k][j-1]+sum2[i-1]-sum2[k]+(d[i]-l)*sum1[i-1]+(l-d[i])*sum1[k];
x3=q[rr-1];x2=q[rr];x1=i;
while(rr>ll&&(Y(x1,j)-Y(x2,j))*(X(x2)-X(x3))
<=(Y(x2,j)-Y(x3,j))*(X(x1)-X(x2)))
{
rr--;
x3=q[rr-1];x2=q[rr];x1=i;
}
q[++rr]=i;
}
}
/* for(int j=2;j<=4;++j)
{
for(int i=1;i<=n;++i)
{
for(int k=1;k<i;++k)
{
dp[i][j]=min(dp[i][j],dp[k][j-1]+sum2[i-1]-sum2[k]+(d[i]-l)*sum1[i-1]+(l-d[i])*sum1[k]);
}
}
}*/
ans=0x3f3f3f3f;
for(int i=1;i<=4;++i)ans=min(ans,dp[n][i]);
write(ans);
cout<<endl;
return 0;
}