用链表存堆然后合并
#include<bits/stdc++.h>
#define ll long long
#define over(i, a, b) for(i = a; i <= b; i += 1)
#define fover(i, a, b) for(i = b; i >= a; i -= 1)
using namespace std;
ll a, b, c, d, e, f, g, h, i, j, k, l, m, n, o,p, q, r, s, t, u, v, w, x, y, z;
ll maxx, maxx2, minn, ans, ans2, len, mapp[1000][1000], val[1000][1000], num[1001000];
ll tree[30][100000], lazy[400100], en[30][100000], pos[600000];
ll mid, tot, ixx[60000], iyy[60000], ix, iy, cntx, cnty, xnum[60000], ynum[60000], cnt;
ll x1, x2, yy1, y2, dist1, dist2, l1, l2, dp[31][101][101][101], dp2[200100], MOD = 10007, flag;
string S, S1, S2;
char C;
stack<ll>T, T2;
queue<ll> Q;
struct node
{
ll v, n;
ll p, lst, nxt, jump, jumpend;
}N[501000];
bool cmp(node a, node b)
{
return (a.v == b.v) ? (a.n < b.n) : (a.v < b.v);
}
inline void read(ll &a)
{
a = 0;char c;int f;
do{c = getchar();}
while(!(c >= '0' && c <= '9' || c == '-'));
if(c == '-'){f = -1;c = getchar();}
while(c >= '0' && c <= '9'){a = a * 10 + c - '0';c = getchar();}
}
inline void write(ll x)
{
if(x >= 10)write(x / 10);
putchar(x % 10 + '0');
}
int main()
{
freopen("fruit.in", "r", stdin);
freopen("fruit.out", "w", stdout);
t = 1;
//read(t);
while(t--)
{
read(n);
p = 2;
over(i, 1, n)
{
read(num[i]);
if(p == num[i])continue;
p = num[i];
N[++tot].p = i;
N[tot].lst = tot - 1;
N[tot].nxt = tot + 1;
N[tot].jumpend = tot;
}
N[0].nxt = 1;
N[tot + 1].lst = tot;
N[tot + 1].p = n + 1;
num[0] = 2;
num[n + 1] = 3;
while(N[0].nxt != tot + 1)
{
for(i = N[0].nxt; i <= tot; i = N[i].nxt)
{
write(N[i].p);
printf(" ");
N[i].p += 1;
if(num[N[i].p] != num[N[i].p - 1])
{
if(N[i].jump)
{
N[i].p = N[N[i].jump].p;
N[i].jump = N[N[i].jump].jump;
}
else
{
N[N[i].lst].nxt = N[i].nxt;
N[N[i].nxt].lst = N[i].lst;
}
}
}
for(i = 0; i <= tot; i = N[i].nxt)
{
while(num[N[i].p] == num[N[N[i].nxt].p])
{
if(!N[i].jump)
{
N[i].jump = N[i].nxt;
N[i].jumpend = N[N[i].nxt].jumpend;
}
else
{
N[N[i].jumpend].jump = N[i].nxt;
N[i].jumpend = N[N[i].nxt].jumpend;
}
N[i].nxt = N[N[i].nxt].nxt;
N[N[i].nxt].lst = i;
}
}
printf("\n");
}
}
return 0;
}