#include using namespace std; using ll = long long; using pii = pair; struct lazysegtree{ int size = 1; vector dat, lazy; lazysegtree(int sz){ int x = 1; while(x < sz)x *= 2; size = x; dat.resize(2 * x - 1); lazy.resize(2 * x - 1, -1); } void eval(int k){ if(lazy[k] == -1)return; dat[k] = lazy[k]; if(k < size - 1){ eval(2 * k + 1); eval(2 * k + 2); lazy[2 * k + 1] = lazy[k]; lazy[2 * k + 2] = lazy[k]; } lazy[k] = -1; } void build(){ for(int k = 0; k < size - 1; k++)eval(k); } void update_(int l, int r, int a, int b, int k, int x){ eval(k); if(b <= l || r <= a)return; if(l <= a && b <= r){ lazy[k] = x; return; } update_(l, r, a, (a + b) / 2, 2 * k + 1, x); update_(l, r, (a + b) / 2, b, 2 * k + 2, x); } void update(int l, int r, int x){ update_(l, r, 0, size, 0, x); } int get(int k){ k += size - 1; eval(k); return dat[k]; } }; int main(){ const int INF = 1e9; int N; cin >> N; vector a(N); map cnt; for(int i = 0; i < N; i++){ cin >> a[i]; cnt[a[i]] = {INF, -INF}; } for(int i = 0; i < N; i++){ cnt[a[i]].first = min(cnt[a[i]].first, i); cnt[a[i]].second = max(cnt[a[i]].second, i + 1); } lazysegtree lt(N); for(auto mp: cnt){ int x, l, r; pii p; tie(x, p) = mp; tie(l, r) = p; lt.update(l, r, x); } lt.build(); for(int i = 0; i < N; i++)cout << lt.get(i) << " "; cout << endl; }