splay
#include<cstdio> #include<algorithm> #define inf 0x7fffffff #define N 100010 using namespace std; inline int read() { int x = 0,f = 1;char ch = getchar(); while (ch < '0' || ch > '9') {if (ch == '-')f = -1;ch = getchar();} while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();} return x * f; } struct Data{ int data,pos; }a[N]; bool cmp1 (Data a,Data b) { if (a.data == b.data) return a.pos < b.pos; return a.data < b.data; } int rev[N], mn[N], ch[N][2], mnpos[N], data[N], fa[N], size[N], n, root; inline void pushdown (int x) { if (rev[x]) { rev[x] = 0; rev[ch[x][0]] ^= 1; swap(ch[ch[x][0]][0], ch[ch[x][0]][1]); rev[ch[x][1]] ^= 1; swap(ch[ch[x][1]][0], ch[ch[x][1]][1]); } } inline void pushup (int x) { mn[x] = min(data[x], min(mn[ch[x][0]], mn[ch[x][1]])); if(mn[x] == data[x]) mnpos[x] = x; else if (mn[x] == mn[ch[x][0]]) mnpos[x] = mnpos[ch[x][0]]; else mnpos[x] = mnpos[ch[x][1]]; size[x] = size[ch[x][0]] + size[ch[x][1]] + 1; } inline int son (int x) { return ch[fa[x]][1] == x; } inline void rotate (int x) { int y = fa[x], z = fa[y], b = son(x), c = son(y), a = ch[x][!b]; if (z) ch[z][c] = x; else root = x; fa[x] = z; if (a) fa[a] = y; ch[y][b] = a; ch[x][!b] = y; fa[y] = x; pushup(y); pushup(x); } void splay (int &x,int i) { while(fa[x] != i) { int y = fa[x], z = fa[y]; if(z == i) rotate (x); else { pushdown (z); pushdown (y); pushdown (x); if(son (x) == son (y)) rotate (y); rotate (x); else rotate (x); rotate (x); } } } inline int getkth (int k,int rt) { pushdown (rt); if(k == size[ch[rt][0]] + 1) return rt; if(k < size[ch[rt][0]] + 1) return getkth (k, ch[rt][0]); return getkth (k - 1 - size[ch[rt][0]], ch[rt][1]); } inline void reverse (int l, int r) { int ll = getkth (l - 1, root),rr = getkth (r + 1, root), p; splay(ll, 0); splay(rr, ll); p = ch[rr][0]; rev[p] ^= 1; swap(ch[p][0], ch[p][1]); } inline int getmnpos (int l, int r) { int ll = getkth (l - 1, root); int rr = getkth (r + 1, root); splay(ll, 0); splay(rr, ll); return mnpos[ch[rr][0]]; } void dfs (int x) { if( !x ) return; pushdown (x); dfs (ch[x][0]); printf("%d ",x); dfs (ch[x][1]); } int main() { n = read(); for(int i = 2; i <= n + 1; i ++) { data[i] = read(); a[i].data = data[i]; a[i].pos = i; } sort(a + 2, a + n + 2, cmp1); for(int i = 2; i <= n + 1; i ++) data[a[i].pos] = i; for(int i = 0; i <= n + 2; i ++) mn[i] = inf; data[0] = inf; data[1] = inf; data[n + 2] = inf; root = 1; size[0] = 0; for(int i = 1; i <= n + 2; i ++) { fa[i] = i - 1; ch[i][1] = i + 1; } ch[n + 2][1] = 0; for(int i = n + 2; i >= 1; i --) pushup (i); for(int i = 1; i <= n; i ++) { int p = getmnpos (i + 1, n + 1); splay (p, 0); printf("%d",size[ch[p][0]]); reverse(i + 1, size[ch[p][0]] + 1); if(i != n) printf(" "); } printf("\n"); return 0; }