为何这份代码死循环?
#include<bits/stdc++.h>
using namespace std;
int n,a[64040],lst[64040],nxt[64040],f[64040],pre[64040],maxn[64040],vis[64040],maxi,tot=1,head,tail;
stack<int>st[550];
int main(){
cin>>n;
head=1,tail=n;
for(int i=1;i<=n;i++){
cin>>a[i];
nxt[i]=min(n,i+1);
lst[i]=max(1,i-1);
}
while(n){
maxn[tot]=1;
for(int i=head;i<=tail;i=nxt[i]){
f[i]=1;
pre[i]=i;
}
for(int i=head;i<=n;i=nxt[i]){
for(int j=head;j<i;j=nxt[j]){
if(a[j]<a[i]){
if(f[j]+1>f[i]){
f[i]=f[j]+1;
pre[i]=j;
}
}
}
}
for(int i=head;i<=n;i=nxt[i]){
if(f[i]>maxn[tot]){
maxn[tot]=f[i];
maxi=i;
}
}
n-=maxn[tot];
while(pre[maxi]!=maxi){
st[tot].push(maxi);
vis[maxi]=1;
nxt[lst[maxi]]=nxt[maxi];
lst[nxt[maxi]]=lst[maxi];
maxi=pre[maxi];
}
st[tot].push(maxi);
tot++;
if(vis[head]=1){
for(int i=head+1;i<=n;i++){
if(!vis[i]){
head=i;
break;
}
}
}
if(vis[tail]=1){
for(int i=tail-1;i>=1;i--){
if(!vis[i]){
tail=i;
break;
}
}
}
}
tot--;
cout<<tot<<endl;
for(int i=1;i<=tot;i++){
cout<<maxn[i]<<" ";
while(!st[i].empty()){
cout<<st[i].top()<<" ";
st[i].pop();
}
cout<<endl;
}
return 0;
}