#!/usr/bin/python # -*- coding: utf-8 -*- # import from sys import stdin, setrecursionlimit setrecursionlimit(10**8) # def def int_map(): return map(int,input().split()) def int_list(): return ['Null']+list(map(int,input().split())) # 整数のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.) def int_mtx(N): x = [['Null']+list(map(int, stdin.readline().split())) for _ in range(N)] x.insert(0,['Null']) return x # 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.) # AAAAA # BBBBB # CCCCC # のような標準入力を # '0AAAAA' # '0BBBBB' # '0CCCCC' # と受け取る def str_mtx(N): x = ['0'+stdin.readline()[:-1] for _ in range(N)] x.insert(0,'0') return x # 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.) # AAAAA XXXXX # BBBBB YYYYY # CCCCC ZZZZZ # のような標準入力を # [[['0'],[AAAAA],[XXXXX]], # [['0'],[BBBBB],[YYYYY]], # [['0'],[CCCCC],[ZZZZZ]] ] # と受け取る def str_list(N): x = [['0']+list(map(str, stdin.readline().split())) for _ in range(N)] x.insert(0,['0']) return x # 高さH+1, 幅W+1, のゼロ行列の作成 def zero_mtx(H,W): x = [[0]*(W+1) for i in range(H+1)] return x # リストをスペースで分割する(先頭を省く) def print_space(l): return print(" ".join([str(x) for x in l[1:]])) # ゼロインデックスの場合 # 整数のリストのリスト:N行のリスト(各行のリストは同じ長さでなくてよい.) def int_mtx_0(N): x = [list(map(int, stdin.readline().split())) for _ in range(N)] return x # ゼロインデックスの場合 # 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.) def str_mtx_0(N): x = [list(stdin.readline()[:-1]) for _ in range(N)] return x # ゼロインデックスの場合 # リストをスペースで分割する(先頭を省かない) def print_space_0(l): return print(" ".join([str(x) for x in l])) # ゼロインデックスの場合 # 高さH, 幅W, のゼロ行列の作成 def zero_mtx_0(H,W): x = [[0]*W for i in range(H)] return x def int_list_0(): return list(map(int,input().split())) ## インポート from collections import deque # from collections import defaultdict # 順列に使う # import itertools # 最大公約数などに使う # import math # リストの要素の数をdict形式で # import collections # 二次元配列のコピーを作りたいとき # a_copy = deepcopy(a) # from copy import deepcopy # main code class LazySegTree: def __init__(self, initial_data, SegType, UpdateType): if SegType == "min": self.X_f = min; self.X_unit = float('inf') elif SegType == "max": self.X_f = max; self.X_unit = -float('inf') elif SegType == "sum": def segfunc(x, y): return x+y self.X_f = segfunc; self.X_unit = 0 elif SegType == "pro": def segfunc(x, y): return x*y self.X_f = segfunc; self.X_unit = 1 elif SegType == "xor": def segfunc(x, y): return x^y self.X_f = segfunc; self.X_unit = 0 elif SegType == "gcd": from math import gcd self.X_f = gcd; self.X_unit = 0 elif SegType == "lcm": from math import gcd def lcm(a,b): return a//gcd(a,b)*b self.X_f = lcm; self.X_unit = 1 self.A_unit = None self.N = len(initial_data) self.X = [self.X_unit] * (self.N + self.N) self.A = [self.A_unit] * (self.N + self.N) # A_unit = None # (A,*) : 右作用素モノイド A = Z + {A_unit} # 値加算: a*None = a; a*b = a+b # 値代入: a*None = a; a*b = b # 右作用素の二項演算 a*b の定義 # X と A の右作用 x@a の定義 if UpdateType == "add": self.add_or_set = 1 else: self.add_or_set = 0 def a_b(a, b): # a*b の定義 if a == self.A_unit: return b elif b == self.A_unit: return a else: return self.add_or_set*a + b self.A_f = a_b def x_a(x, a): # x@a の定義 if a == self.A_unit: return x return self.add_or_set*x + a self.operate = x_a self.build(initial_data) def leaf(self): return self.X[self.N:] def all_lazy(self): for i in range(self.N): self._propagate_at(i) # for i in range(self.N+1, 2*self.N): # self._eval_at(i) # self.A[i] = self.A_unit def build(self, seq): for i, x in enumerate(seq, self.N): self.X[i] = x for i in range(self.N - 1, 0, -1): self.X[i] = self.X_f(self.X[i << 1], self.X[i << 1 | 1]) def _eval_at(self, i): return self.operate(self.X[i], self.A[i]) def _propagate_at(self, i): self.X[i] = self._eval_at(i) self.A[2*i] = self.A_f(self.A[2*i], self.A[i]) self.A[2*i+1] = self.A_f(self.A[2*i+1], self.A[i]) self.A[i] = self.A_unit def _propagate_above(self, i): H = i.bit_length() - 1 for h in range(H, 0, -1): self._propagate_at(i >> h) def _recalc_above(self, i): while i > 1: i >>= 1 self.X[i] = self.X_f(self._eval_at(i << 1), self._eval_at(i << 1 | 1)) def set_val(self, i, x): i += self.N self._propagate_above(i) self.X[i] = x self.A[i] = self.A_unit self._recalc_above(i) def fold(self, L, R): L += self.N R += self.N self._propagate_above(L // (L & -L)) self._propagate_above(R // (R & -R) - 1) vL = self.X_unit vR = self.X_unit while L < R: if L & 1: vL = self.X_f(vL, self._eval_at(L)) L += 1 if R & 1: R -= 1 vR = self.X_f(self._eval_at(R), vR) L >>= 1 R >>= 1 return self.X_f(vL, vR) def operate_range(self, L, R, x): L += self.N R += self.N L0 = L // (L & -L) R0 = R // (R & -R) - 1 self._propagate_above(L0) self._propagate_above(R0) while L < R: if L & 1: self.A[L] = self.A_f(self.A[L], x) L += 1 if R & 1: R -= 1 self.A[R] = self.A_f(self.A[R], x) L >>= 1 R >>= 1 self._recalc_above(L0) self._recalc_above(R0) n = int(input()) data = int_list_0() from collections import defaultdict d = defaultdict(list) for i,datai in enumerate(data): d[datai].append(i) SegType = "max" UpdateType = "set" seg = LazySegTree(data, SegType, UpdateType) d2 = sorted(d.items()) for k,v in d2: seg.operate_range(v[0],v[-1]+1,k) seg.all_lazy() print_space_0(seg.A[n:])