import numpy from collections import defaultdict """ g(f(a, b), c) = f(g(a, c), g(b, c)) ...cを後から作用させても、先に作用させても結果は同じ。(両方に作用させることに注意) g(g(a, b), c) = g(a, h(b, c)) ...b, cを順番に作用させることはh(b,c)を一回作用させることと同じ。(計算の省略が可能) 例) 例えば区間の最大値を求める + 区間を変更するというクエリでは f(a, b) = max(a, b) (単位元は0) g(a, c) = c(ただしc = 0ならばa) g = h 今回は区間に対してはなにもしない + 区間を変更するというクエリである。 したがって f(a, b) = 0 g(a, c) = c(ただしc = 0ならばa) g = h とすれば良い。(最下段はfの影響を受けない。) """ class segtree: def __init__(self, n, L = None): self.raw_len = n self.list = L self.init() def init(self): N = 1 n = self.raw_len while N < n: N *= 2 self.len = N self.node = [0]*(2*N-1) self.lazy = [0]*(2*N-1) if self.list: for i in range(self.raw_len): self.node[i+self.len-1] = self.list[i] for i in range(self.len - 2, -1, -1): self.node[i] = 0 def update(self, i, x):#点更新 i += self.len - 1 self.node[i] = x while i > 0: i = (i-1)//2 self.node[i] = 0 def eval(self, k): if self.lazy[k] != 0: self.node[k] = self.lazy[k] if k < self.len - 1: #要編集。和なら半数伝播、minmaxなら全数伝播。 self.lazy[2*k+1] = self.lazy[k] self.lazy[2*k+2] = self.lazy[k] self.lazy[k] = 0 def range_update(self, a, b, x, k=0, l=0, r=None): if r == None: r = self.len self.eval(k) if r <= a or b <= l: return 0 if a <= l and r <= b: self.lazy[k] = x #max,minなら(r-l)は書かなくて良い self.eval(k) else: self.range_update(a, b, x, k*2+1, l, (l+r)//2) self.range_update(a, b, x, k*2+2, (l+r)//2, r) self.node[k] = 0 def query(self, a, b, k = 0, l = 0, r = None): if r == None: r = self.len if r <= a or b <= l: return 0 self.eval(k, l, r) if a <= l and r <= b: return self.node[k] else: vl = self.query(a, b, k*2+1, l, (l+r)//2) vr = self.query(a, b, k*2+2, (l+r)//2, r) return 0 def nodes(self): for i in range(2*self.len-1): self.eval(i) res = self.node[self.len-1:] return list(res) N = int(input()) a = [int(i) for i in input().split()] dr = {} #数numのうち最も右にあるものはdr[num] dl = {} for i, num in enumerate(a): dr[num] = i ar = a[::-1] for i, num in enumerate(ar): dl[num] = N-1-i seg = segtree(N) for num, _ in sorted(dr.items()): l = dl[num] r = dr[num] seg.range_update(l, r+1, num) ans = seg.nodes() ans = [str(i) for i in ans if i] print(" ".join(ans))