#include typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() using namespace std; class GakuX5 { public: void solve(void) { int n; cin>>n; // // bi が t に置き換えられるのは bi の左右に t が存在するときなので // bi = max{t| l<=i<=r && t == a[l] == a[r]} // t // // 区間を管理するために a[i] が出現する最も右側の indext を登録しておく vector a(n); map mostRight; REP(i,n) { cin>>a[i]; mostRight[a[i]] = i; // a[i] が出現する最右 index を登録 } set s; // O(n*log(n)) REP(i,n) { s.insert(a[i]); // bi 出力時に登録されている a[i] は i か、それより左側の a[i] cout<<*s.rbegin(); // 登録されているもののうち最大のものを出力 // 以後右側に a[i] はない if (i == mostRight[a[i]]) s.erase(a[i]); if (i != n-1) cout<<" "; } cout<solve(); delete obj; return 0; } #endif