rt,交一样的代码有一定概率会ce,把线段树里的初值改成1e18一定ce
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO
{
char buff[1<<21],*p1=buff,*p2=buff;
char getch(){return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;}
template<typename T>void read(T &x){char ch=getch();int fl=1;x=0;while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}x*=fl;}
template<typename T>void read_s(T &x){char ch=getch();while(ch<'A'||ch>'Z')ch=getch();while(ch>='A'&&ch<='Z'){x+=ch;ch=getch();}}
template<typename T,typename ...Args>void read(T &x,Args& ...args){read(x);read(args...);}
char obuf[1<<21],*p3=obuf;
void putch(char ch) {if(p3-obuf<(1<<21))*p3++=ch;else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;}
char ch[100];
template<typename T>void write(T x) {if(!x)return putch('0');if(x<0)putch('-'),x*=-1;int top=0;while(x)ch[++top]=x%10+48,x/=10;while(top)putch(ch[top]),top--;}
template<typename T,typename ...Args>void write(T x,Args ...args) {write(x);write(args...);}
void put(string s){for(int i=0;i<s.size();i++)putch(s[i]);}
void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
int n,m;
int w[114514],h[114514];
namespace Elaina
{
struct segt
{
int val=1e9,tag=1e9;
}t[114514<<2];
#define ls (root<<1)
#define rs (root<<1|1)
#define mid (l+r>>1)
void update(int root){t[root].val=min(t[ls].val,t[rs].val);}
void down(int root)
{
if(t[root].tag==1e9) return;
t[ls].tag=min(t[root].tag,t[ls].tag);
t[rs].tag=min(t[root].tag,t[rs].tag);
t[ls].val=min(t[root].tag,t[ls].val);
t[rs].val=min(t[root].tag,t[rs].val);
t[root].tag=1e9;
}
void cov(int x,int y,int v,int l=0,int r=n,int root=1)
{
if(l>=x&&r<=y)
{
t[root].val=min(t[root].val,v);
t[root].tag=min(t[root].tag,v);
return;
}
down(root);
if(x<=mid) cov(x,y,v,l,mid,ls);
if(y>mid) cov(x,y,v,mid+1,r,rs);
update(root);
}
int query(int x,int y,int l=0,int r=n,int root=1)
{
if(l>=x&&r<=y) return t[root].val;
down(root);
int res=1e9;
if(x<=mid) res=min(res,query(x,y,l,mid,ls));
if(y>mid) res=min(res,query(x,y,mid+1,r,rs));
return res;
}
#undef ls
#undef rs
#undef mid
}
namespace ldnn
{
int st[114514][20],lg[114514];
inline void bld()
{
for(int i=1;i<=n;i++) st[i][0]=i;
for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
for(int j=1;j<20;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
st[i][j]=h[st[i][j-1]]>h[st[i+(1<<(j-1))][j-1]]?st[i][j-1]:st[i+(1<<(j-1))][j-1];
}
inline int query(int l,int r)
{
int k=lg[r-l+1];
return h[st[l][k]]>h[st[r-(1<<k)+1][k]]?st[l][k]:st[r-(1<<k)+1][k];
}
}
#define seg Elaina
#define st ldnn
int sum[114514];
void solve(int l,int r)
{
if(l>r) return;
if(l==r)
{
seg::cov(l,l,seg::query(l-1,l-1)+h[l]);
return;
}
int pos=st::query(l,r);
solve(l,pos-1);
if(pos-l<=r-pos)
{
int cur=pos;
for(int i=l;i<=pos;i++)
{
while(cur<r&&sum[cur+1]-sum[i-1]<=m) ++cur;
if(sum[cur]-sum[i-1]>m) continue;
seg::cov(pos,cur,seg::query(i-1,i-1)+h[pos]);
}
}
else
{
int cur=pos;
for(int i=r;i>=pos;i--)
{
while(cur>l&&sum[i]-sum[cur-2]<=m) --cur;
if(sum[i]-sum[cur-1]>m) continue;
seg::cov(i,i,seg::query(cur-1,pos)+h[pos]);
}
}
solve(pos+1,r);
}
signed main()
{
read(n,m);
for(int i=1;i<=n;i++) read(h[i],w[i]);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+w[i];
st::bld();
seg::cov(0,0,0);
solve(1,n);
write(seg::query(n,n));
flush();
}