#include #define rep(i,n) for(int i=0;i<(int)(n);i++) using namespace std; using ll = long long ; using P = pair ; using pll = pair; constexpr int INF = 1e9; constexpr long long LINF = 1e17; constexpr int MOD = 1000000007; constexpr double PI = 3.14159265358979323846; struct range_path{ int n; int N; int V; vector>> Graph; range_path(int n):n(n){ N=1; while(N=r||L>=R) return; Graph.emplace_back(); Graph.emplace_back(); V+=2; add_edge_from(0,l,r,0,N,V-2); add_edge_to(0,L,R,0,N,V-1); Graph[V-2].emplace_back(cost,V-1); } }; /* int main(){ int n; cin >> n; range_path G(n); G.add_edge(1,4,3,7,1); rep(i,G.V){ for(auto j:G.Graph[i]) cout << j.first <<" " << j.second << " "; cout << endl; } return 0; } */ int main(){ int n,a,b; cin >> n >> a >> b; vector x(n); rep(i,n) cin >> x[i]; range_path G(n); rep(i,n){ int l = lower_bound(x.begin(),x.end(),x[i]+a) - x.begin(); int r = upper_bound(x.begin(),x.end(),x[i]+b) - x.begin(); G.add_edge(i,i+1,l,r,0); G.add_edge(l,r,i,i+1,0); } vector ans(10*G.N+3,-1); rep(i,n){ if(ans[i+G.N-1]>=0) continue; int id = i+G.N-1; queue q; vector vv; q.push(id); vv.push_back(id); int res = 0; while(!q.empty()){ int next = q.front(); q.pop(); if(ans[next]>=0) continue; ans[next]=0; vv.push_back(next); if(G.N-1<=next&&next=0) continue; q.push(j.second); } } for(int j:vv) ans[j] = res; } rep(i,n){ cout << ans[i+G.N-1] << endl; } return 0; }