#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m;
int root,ll,rr,zz;
struct node{
int val,id;
friend bool operator<(node x,node y){
if(x.val==y.val) return x.id<y.id;
else return x.val<y.val;
}
}a[N];
struct treap{
int lson,rson;
int val,pri,siz;
int tag,mn;
}op[N];
int cnt;
int build(int x){
op[++cnt].val=x;
op[cnt].pri=rand();
op[cnt].siz=1;
op[cnt].mn=x;
return cnt;
}
void push_up(int num){
op[num].siz=op[op[num].lson].siz+op[op[num].rson].siz+1;
op[num].mn=op[num].val;
if(op[num].lson) op[num].mn=min(op[num].val,op[op[num].lson].mn);
if(op[num].rson) op[num].mn=min(op[num].val,op[op[num].rson].mn);
}
void push_down(int num){
if(op[num].tag){
swap(op[num].lson,op[num].rson);
if(op[num].lson) op[op[num].lson].tag^=1;
if(op[num].rson) op[op[num].rson].tag^=1;
op[num].tag=0;
}
}
void split(int num,int x,int &l,int &r){
if(!num){
l=r=0;
return;
}
push_down(num);
if(op[op[num].lson].siz<x){
x=x-op[op[num].lson].siz-1;
l=num;
split(op[l].rson,x,op[l].rson,r);
}
else{
r=num;
split(op[r].lson,x,l,op[r].lson);
}
push_up(num);
}
int merge(int l,int r){
if(!l||!r){
return l+r;
}
if(op[l].pri<op[r].pri){
push_down(l);
op[l].rson=merge(op[l].rson,r);
push_up(l);
return l;
}
else{
push_down(r);
op[r].lson=merge(l,op[r].lson);
push_up(r);
return r;
}
}
int sv[N];
int get_rk(int x){
int res=1;
while(1){
push_down(x);
if(op[x].lson&&op[x].mn==op[op[x].lson].mn){
x=op[x].lson;
}
else if(op[x].rson&&op[x].mn==op[op[x].rson].mn){
res+=op[op[x].lson].siz+1;
x=op[x].rson;
}
else return res+op[op[x].lson].siz;
}
}
void output(int x){
if(!x) return;
push_down(x);
output(op[x].lson);
cout<<op[x].val<<" ";
output(op[x].rson);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].val;
a[i].id=i;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
sv[a[i].id]=i;
}
for(int i=1;i<=n;i++){
root=merge(root,build(sv[i]));
}
for(int i=1;i<=n;i++){
int rk=get_rk(root);
split(root,rk,ll,rr);
split(ll,rk-1,ll,zz);
op[ll].tag^=1;
root=merge(ll,rr);
cout<<i+rk-1<<" ";
}
return 0;
}
只能过样例