1 #include <cstdio>
2 #include <algorithm>
3 #include <cstring>
4
5 using namespace std;
6
7 #define Key_value (ch[ch[root][1] ][0])
8
9 const int maxn = 2e5+10;
10 const int INF = 0x3f3f3f3f;
11
12 int pre[maxn],ch[maxn][2],key[maxn],size[maxn];
13 int root,tot1;
14 int rev[maxn];
15 int s[maxn],tot2;
16 int N;
17
18 struct Node{
19 int num,id;
20 bool operator < (const Node &rhs) const
21 {
22 if(num == rhs.num) return id < rhs.id;
23 else return num < rhs.num;
24 }
25 }node[maxn];
26
27 void Treavel(int x)
28 {
29 if(x)
30 {
31 Treavel(ch[x][0]);
32 printf("结点:%2d: 左儿子 %2d 右儿子 %2d 父结点 %2d size= %2d val=%2d
",x,ch[x][0],ch[x][1],pre[x],size[x],key[x]);
33 Treavel(ch[x][1]);
34 }
35 }
36
37 void debug()
38 {
39 printf("root:%d
",root);
40 Treavel(root);
41 }
42
43 void NewNode(int &o,int father,int k)
44 {
45 o = k;
46 pre[o] = father;
47 ch[o][0] = ch[o][1] = 0;
48 rev[o] = 0;
49 size[o] = 1;
50 }
51 void update_rev(int o)
52 {
53 if(!o) return ;
54 swap(ch[o][0],ch[o][1]);
55 rev[o] ^= 1;
56 }
57 void push_up(int o)
58 {
59 int lson = ch[o][0],rson = ch[o][1];
60 size[o] = size[lson]+size[rson] + 1;
61 }
62 void push_down(int o)
63 {
64 if(rev[o])
65 {
66 update_rev(ch[o][0]);
67 update_rev(ch[o][1]);
68 rev[o] = 0;
69 }
70 }
71 void Build(int &x,int l,int r,int father)
72 {
73 if(l > r) return ;
74 int mid = (l+r)>>1;
75 NewNode(x,father,mid);
76 Build(ch[x][0],l,mid-1,x);
77 Build(ch[x][1],mid+1,r,x);
78 push_up(x);
79 }
80 void Init()
81 {
82 root = tot1 = tot2 = 0;
83 ch[root][0] = ch[root][1] = size[root] = pre[root] = 0;
84 rev[root] = 0;
85 NewNode(root,0,N+1);
86 NewNode(ch[root][1],root,N+2);
87
88 Build(Key_value,1,N,ch[root][1]);
89 push_up(ch[root][1]);
90 push_up(root);
91 }
92 void Rotate(int x,int kind)
93 {
94 int y = pre[x];
95 push_down(y);
96 push_down(x);
97 ch[y][!kind] = ch[x][kind];
98 pre[ch[x][kind] ] = y;
99 if(pre[y])
100 ch[pre[y] ][ch[pre[y]][1]==y ] = x;
101 pre[x] = pre[y];
102 ch[x][kind] = y;
103 pre[y] = x;
104 push_up(y);
105 }
106 void Splay(int x,int goal)
107 {
108 push_down(x);
109 while(pre[x] != goal)
110 {
111 if(pre[pre[x] ] == goal)
112 {
113 push_down(pre[x]);
114 push_down(x);
115 Rotate(x,ch[pre[x]][0]==x);
116 }
117 else
118 {
119 push_down(pre[pre[x] ]);
120 push_down(pre[x]);
121 push_down(x);
122 int y = pre[x];
123 int kind = ch[pre[y] ][0] == y;
124 if(ch[y][kind] == x)
125 {
126 Rotate(x,!kind);
127 Rotate(x,kind);
128 }
129 else
130 {
131 Rotate(y,kind);
132 Rotate(x,kind);
133 }
134 }
135 }
136 push_up(x);
137 if(goal == 0) root = x;
138 }
139 int Get_kth(int x,int k)
140 {
141 push_down(x);
142 int t = size[ch[x][0]] + 1;
143 if(t==k) return x;
144 if(t > k) return Get_kth(ch[x][0],k);
145 else return Get_kth(ch[x][1],k-t);
146 }
147 int Get_next(int x)
148 {
149 push_down(x);
150 if(ch[x][1] == 0) return -1;
151 x = ch[x][1];
152 while(ch[x][0])
153 {
154 x = ch[x][0];
155 push_down(x);
156 }
157 return x;
158 }
159 int main()
160 {
161 while(scanf("%d",&N) && N)
162 {
163 for(int i=1;i<=N;i++)
164 {
165 scanf("%d",&node[i].num);
166 node[i].id = i;
167 }
168 sort(node+1,node+N+1);
169 Init();
170 for(int i=1;i<=N;i++)
171 {
172 Splay(node[i].id,0);
173 printf("%d%s",size[ch[root][0]],i==N?"":" ");
174 Splay(Get_kth(root,i),0);
175 Splay(Get_next(node[i].id),root);
176 update_rev(Key_value);
177 }
178 printf("
");
179 }
180 }