代码可能不够精简
#include <bits/stdc++.h>
using namespace std;
#define maxn 500010
int a[maxn];
struct node{
int v,p;
}b[maxn]; //构造一个单调数组便于二分(二分查找的前提条件)
int r[maxn];//记录结果
int cou=0;
int b_search(int x)
{
int l=1,r=cou;
while(l<=r){
int mid=l+r>>1;
if(b[mid].v>x){
if(b[mid-1].v<x)return b[mid].p;
else r=mid-1;
}
else if(b[mid].v==x)return b[mid].p;
else {
if(b[mid+1].v>=x)return b[mid+1].p;
else l=mid+1;
}
}
return b[l].p;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
queue<int>q;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
q.push(a[n]);
b[++cou].v=a[n];
b[cou].p=n;
int ma=a[n];
for(int i=n-1;i>=1;i--){
//cout<<q.front()<<endl;
if(a[i]>q.front()){ //压入更大的数(同时便于构造单调序列)
ma=a[i]; //记录最大的数
q.pop();
q.push(a[i]);
b[++cou].v=a[i];
b[cou].p=i;
r[i]=-1;
}else{
if(a[i]+m>=a[n]&&a[i]+m<=ma){ //在单调数组中a[n]是最小的,ma是最大的
r[i]=b_search(a[i]+m)-i-1; //a[i]+m在单调数组的区间内就进行二分
}else if(a[i]+m<a[n]){
r[i]=n-i-1;
}else if(a[i]+m>ma){
r[i]=-1;
}
}
}
r[n]=-1;
for(int i=1;i<=n;i++){if(i!=n)cout<<r[i]<<" ";else cout<<r[i]<<endl;}
return 0;
}