N-牛は、1〜n個の高さには知られており、様々であるが、各牛の正確な高さを知らないされています。
今、nは牛をスタンド、牛は、以前私知られたA Iが各牛の高さを必要以上に愛牛低いです。
入力形式
1行目:入力整数n。
最初の行2..n:行あたり整数A I愛、i番目の行は、牛が私があることを示しA I、それよりも低い愛牛。
(注:牛は、最初の牛の前に存在しないため、それが表示されていないので)
出力フォーマット
n個の出力線、高整数牛の各出力ラインを含みます。
i行目I牛の高さの出力。
データ範囲
1 ≤ N ≤ 10 5 1≤n≤105
サンプル入力:
5
1
2
1
0
出力例:
2
4
5
3
1
解決策:この問題は、のみ、n個のヘッドの高さが同じではないので、牛、牛を発見する権利があるので、私たちが今まで使用したウシ牛の現在の高さを記録するためにツリー状のアレイを構築することができます(値のツリー状の配列を表しますフェンウィックツリーがデフォルトの昇順行なので、今私たちはどれだけ多くの頭あたりの牛の頭部のより短いの前を通過する逆にする必要があるため、現在のすべての牛は、)いくつかの高の最初の未使用の牛であるということですARR配列(電流値自体は[I] + 1 ARR牛である)、我々は木からアレイに記録し、[I] + 1高さ、およびARRウシ配列の二分木を見つけますこの牛が減算され、上記動作がN回繰り返されます。
書式#include <iostreamの> の#include <cstdioを> 使用して名前空間はstdを、const int型 MAXN = 1E5 + 7 。int型のn; int型のツリー[MAXN]。 // 01标记N头牛是否使用过INT ARR [MAXN]。 int型ANS [MAXN]。INT lowbit(INT X){ 戻り X&( - X)。 } ボイド追加(int型のx、int型のval){ 一方(X <= N){ ツリー[X] + = ヴァル。 X + = lowbit(X)。 } } のIntは、 ASK(INT X){ int型 RES = 0 ; 一方、(X> = 1 ){ RES + = ツリー[X]; X - = lowbit(X); } 戻りRES; } int型(メイン){ scanfの(" Dの%"およびN-)、 追加(1、1); // すべての牛を加えたフェンウィックツリー のための(int型 I = 2 ; I <= N; I ++は){ scanfの(" %D "、およびARR [I]); 追加(I、1 ); } のための(INT I = N-; Iは> = 1 ; i--){ // 逆トラバースウシ見つける必要が int型 = Lを1、R&LT = N-; ながら(L <R&LT){ // 最初の[I] + 1頭の牛(それよりも[I]ウシ短いARRこのフロントので牛、ARR探しでソート半分の高さは、それが最初に所有[I] + 1頭の牛)ARR int型 MID =(L + R&LT)を>> 1 ; IF <ARR [I] +((MIDをASK)1。){ L = MID + 1 ; } 他{ R&LT =MID; } } ANS [I] = R&LT; 追加(R&LT、 - 。1); // 牛が現在使用するので、それは(タグ配列を除去するために、ツリー内)を減算するよう } のための(INT I = 。1 ; I <= N; I ++ ){ のprintf(" %Dの\のN- " 、ANS [I]); } 戻り 0 ; }