//デバッグ用オプション:-fsanitize=undefined,address //コンパイラ最適化 #pragma GCC optimize("Ofast") //インクルードなど #include using namespace std; typedef long long ll; //マクロ //forループ //引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか //Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる //FORAは範囲for文(使いにくかったら消す) #define REP(i,n) for(ll i=0;i=0;i--) #define FOR(i,a,b) for(ll i=a;i<=ll(b);i++) #define FORD(i,a,b) for(ll i=a;i>=ll(b);i--) #define FORA(i,I) for(const auto& i:I) //xにはvectorなどのコンテナ #define ALL(x) x.begin(),x.end() #define SIZE(x) ll(x.size()) //定数 #define INF 1000000000000 //10^12:∞ #define MOD 1000000007 //10^9+7:合同式の法 #define MAXR 100000 //10^5:配列の最大のrange //略記 #define PB push_back //挿入 #define MP make_pair //pairのコンストラクタ #define F first //pairの一つ目の要素 #define S second //pairの二つ目の要素 //以下、素集合と木は同じものを表す class UnionFind { public: vector parent; //parent[i]はiの親 vector siz; //素集合のサイズを表す配列(1で初期化) map> group;//素集合ごとに管理する連想配列(keyはそれぞれの素集合の親、valueはその素集合の要素の配列) //コンストラクタの:の後ろでメンバ変数を初期化 UnionFind(ll n):parent(n),siz(n,1){ //最初は全ての要素の根はそれ自身であるとして初期化 for(ll i=0;i>n>>a>>b; vector x(n);REP(i,n)cin>>x[i]; UnionFind u(n); REP(i,n){ auto l=lower_bound(ALL(x),x[i]+a); while(l!=x.end()){ if((*l)>x[i]+b)break; u.unite(i,ll(l-x.begin())); l++; } } u.grouping(n); vector ans(n); FORA(v,u.group){ ll l=SIZE(v.S); REP(i,l){ ans[v.S[i]]=l; } } REP(i,n)cout<