#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define rng(i,x,n) for(int i=x;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define vec(...) vector<__VA_ARGS__>
#define _3HspL4A ios::sync_with_stdio(0),cin.tie(0)
typedef long long ll;
using pii=pair<int,int>;
using vi=vec(int);
void print(){cout<<"\n";}
template<class T,class...E>
void print(const T&v,const E&...u){cout<<v<<' ',print(u...);}
// e
pii op(pii l,pii r){
if(l.fi!=r.fi) return l.se>r.se?l:r;
return l.fi>r.fi?l:r;
}
pii e(){
return {0,-1};
}
int op1(int l,int r){
return max(l,r);
}
int e1(){
return -1;
}
signed main(){
_3HspL4A;
int n;
cin>>n;
vi a(n);
rep(i,n) cin>>a[i];
vi id(n);
rep(i,n){
a[i]-=1;
id[a[i]]=i;
}
int len;
{
set<int> st;
for(auto x:a){
if(!sz(st)){
st.insert(x);
}else{
auto it=st.lower_bound(x);
if(it!=st.end()){
st.erase(it);
}
st.insert(x);
}
}
len=sz(st);
}
atcoder::segtree<pii,op,e> seg(n);
vi nxt(n);
rep(i,n){
int x=a[i];
pii val=seg.prod(0,x);
nxt[i]=val.se;
val.fi++;
val.se=x;
seg.set(x,val);
}
pii p=seg.prod(0,n);
assert(p.fi==len);
vi layer;
int i=id[p.se];
while(1){
layer.pb(i);
if(nxt[i]==-1) break;
i=id[nxt[i]];
}
reverse(layer.begin(),layer.end());
atcoder::segtree<int,op1,e1> nseg(a);
for(auto v:layer){
nseg.set(v,-1);
}
vec(vi) pns;
pns.pb(layer);
vi qol=layer;
while(1){
layer={};
per(j,len){
if(qol[j]>=n-1) break;
bool pok=1;
while(1){
int val=nseg.prod(qol[j]+1,(j==len-1?n:qol[j+1]));
if(val==-1){
pok=0;
break;
}
nseg.set(id[val],-1);
if(!sz(layer) or a[layer.back()]>val){
layer.pb(id[val]);
qol[j]=id[val];
break;
}
}
if(!pok) break;
}
if(sz(layer)!=len) break;
reverse(layer.begin(),layer.end());
pns.pb(layer);
}
print(sz(pns));
for(auto ids:pns){
for(auto v:ids) cout<<v+1<<" ";
print();
}
//
return 0;
}
Compilation message
Main.cpp:2:10: fatal error: atcoder/all: No such file or directory
2 | #include <atcoder/all>
| ^~~~~~~~~~~~~
compilation terminated.