#include #include #include using namespace std; using i64 = long long; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x seg, lazy; void push(int k, int l, int r); i64 merge(i64 x, i64 y); void update(int lo, int hi, i64 val, int k, int l, int r); i64 query(int lo, int hi, int k, int l, int r); public: Segtree(int n); void update(int lo, int hi, i64 val); // [lo, hi) void update(int i, i64 val); i64 query(int lo, int hi); // [lo, hi) i64 query(int i); }; void Segtree::push(int k, int l, int r) { if(lazy[k] == -1) { return; } seg[k] = lazy[k] * (r-l); if(r-l > 1) { lazy[k*2+1] = lazy[k]; lazy[k*2+2] = lazy[k]; } lazy[k] = -1; } i64 Segtree::merge(i64 x, i64 y) { return x + y; } void Segtree::update(int lo, int hi, i64 val, int k, int l, int r) { push(k, l, r); if(r <= lo || hi <= l) { return; } if(lo <= l && r <= hi) { lazy[k] = val; push(k, l, r); return; } update(lo, hi, val, k*2+1, l, (l+r)/2); update(lo, hi, val, k*2+2, (l+r)/2, r); seg[k] = merge(seg[k*2+1], seg[k*2+2]); } i64 Segtree::query(int lo, int hi, int k, int l, int r) { push(k, l, r); if(r <= lo || hi <= l) { return 0; } if(lo <= l && r <= hi) { return seg[k]; } i64 x = query(lo, hi, k*2+1, l, (l+r)/2), y = query(lo, hi, k*2+2, (l+r)/2, r); return merge(x, y); } Segtree::Segtree(int n) { for(size=1; size a(n); map left, rght; Segtree tree(n); for(int i : range(n)) { scanf("%d", &a[i]); tree.update(i, a[i]); } for(int i : range(n)) { rght[a[i]] = i; left[a[n-1-i]] = n-1-i; } for(auto kv : left) { int val, pos; tie(val, pos) = kv; if(!rght.count(val)) { continue; } tree.update(pos, rght[val]+1, val); } for(int i : range(n)) { if(i) { putchar(' '); } printf("%d", int(tree.query(i))); } putchar('\n'); return 0; }