#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define re register
#define int long long
#define maxn 500010
using namespace std;
int n,d,k;
int ans=-1;
int x[maxn],s[maxn];
int f[maxn];
int q[maxn];
inline bool dp(int g) {
memset(f,-0x3f,sizeof f);
int head=1,tail=0,mx=-1,cur=0;
q[1]=0,f[0]=0;
for(re int i=1;i<=n;++i) {
int l=x[i]-d-g,r=min(x[i]+g-d,x[i]-1);
while(x[cur]<=r) {
while(head<=tail&&f[q[tail]]<=f[cur])--tail;
if(f[cur]!=-inf)q[++tail]=cur;
++cur;
}
while(head<=tail&&x[q[head]]<l)++head;
if(head<=tail)f[i]=f[q[head]]+s[i];
mx=max(mx,f[i]);
if(mx>=k)return true;
}
return false;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>d>>k;
for(re int i=1; i<=n; ++i) {
cin>>x[i]>>s[i];
}
int l=0,r=1000000000;
while(l<=r) {
int g=(l+r)>>1;
if(dp(g)) {
ans=g;
r=g-1;
} else l=g+1;
}
cout<<ans;
return 0;
}
为什么单调队列不能先弹出队头啊
即24行为什么不能提到19行前面