#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
vector<ii> ft;
void upd(int p, ii v){
while(p<(int)ft.size()){
if(ft[p].first == v.first){
ft[p] = min(ft[p],v);
}else{
ft[p] = max(ft[p],v);
}
p+=p&(-p);
}
}
ii qry(int p){
ii ans=ii(0,-1);
while(p>0){
ans = max(ft[p],ans);
p-=p&(-p);
}
return ans;
}
signed main(){
int n, maxl;
cin>>n;
vector<int> v(n,0);
for(int i=0;i<n;++i){
cin>>v[i];
}
map<int,vector<ii>> lis;
ft = vector<ii> (n+1,ii(0,-1));
for(int i=0;i<n;++i){
auto curr = qry(v[i]);
curr.first++;
upd(v[i],ii(curr.first,i));
lis[curr.first].push_back(ii(i,curr.second));
maxl = max(maxl,curr.first);
}
vector<int> visited(n,0);
vector<vector<int>> ans;
int cnt=0;
for(auto e:lis[maxl]){
vector<int> ind{e.first};
ii curr = e;
int pos=maxl-1;
auto nextind = lis[pos].begin();
bool pass=true;
visited[curr.first]=1;
while(pass){
if(pos==0) break;
nextind = lower_bound(lis[pos].begin(),lis[pos].end(),ii(curr.second,-1));
pos--;
while(visited[(*nextind).first]==1){
nextind++;
if(nextind==lis[pos].end()){
pass=false;
break;
}
}
visited[(*nextind).first]=1;
ind.push_back((*nextind).first);
if((*nextind).second==-1){
break;
}
curr=*nextind;
}
if(pass){
cnt++;
ans.push_back(ind);
}
}
cout<<cnt<<' '<<maxl<<'\n';
for(auto e:ans){
for(int i=e.size()-1;i>=0;--i){
cout<<e[i]+1<<' ';
}
cout<<'\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |