#{{{ header import algorithm, sequtils, tables, macros, math, sets, strutils when defined(MYDEBUG): import header proc scanf(formatstr: cstring){.header: "", varargs.} proc getchar(): char {.header: "", varargs.} proc nextInt(): int = scanf("%lld",addr result) proc nextFloat(): float = scanf("%lf",addr result) proc nextString(): string = var get = false result = "" while true: var c = getchar() if int(c) > int(' '): get = true result.add(c) else: if get: break get = false template `max=`*(x,y:typed):void = x = max(x,y) template `min=`*(x,y:typed):void = x = min(x,y) template infty(T): untyped = ((T(1) shl T(sizeof(T)*8-2)) - 1) #}}} type LazySegmentTree[S,T] = object f:proc(x,y:S):S g:proc(x:S,d:T,n:int):S h:proc(x,y:T):T sz:int data:seq[S] lazy:seq[T] M1:S OM0:T proc newLazySegmentTree[S,T](n:int,f:proc(x,y:S):S, g:proc(x:S,d:T,n:int):S, h:proc(x,y:T):T, M1:S, OM0:T):LazySegmentTree[S,T] = var sz = 1 while sz < n: sz *= 2 return LazySegmentTree[S,T](f:f,g:g,h:h,sz:sz,data:newSeqWith(2*sz,M1),lazy:newSeqWith(2*sz,OM0)) proc set[S,T](self:var LazySegmentTree[S,T], v:openarray[S]):void = for k in 0.. 1: let m = ((l+r) shr 1) self.write(h+1,k*2 ,l,m) self.write(h+1,k*2+1,m,r) proc write[S,T](self:var LazySegmentTree[S,T]):void = echo "tree: " self.write(0,1,0,self.sz) let INF = 10^9 proc main():void = var n = nextInt() a = newSeqWith(n,nextInt()) left = newSeqWith(n,INF) right = newSeqWith(n,-INF) proc f(a,b:int):int = return a + b proc g(a,d,n:int):int = return d proc h(a,b:int):int = return b var st = newLazySegmentTree(n,f,g,h,0,-1) var v = a v.sort() v = v.deduplicate(true) for i in 0..n-1: let id = binarySearch(v,a[i]) left[id] = min(left[id],i) right[id] = max(left[id],i) for i in 0..n-1: if left[i] == INF: break st.update(left[i],right[i]+1,v[i]) for i in 0..n-1: stdout.write st[i]," " echo "" discard main()