Pagini recente » Cod sursa (job #1206833) | Rezultatele filtrării | Cod sursa (job #450718) | Cod sursa (job #2555429) | Cod sursa (job #2373897)
#include <bits/stdc++.h>
using namespace std;
int v[100010],n,tata[100010],v1[100010];
vector<int> q;
pair<int,int> aib[100010];
void update(int poz,pair<int,int> val)
{
for(int i=poz;i<=n;i+=i&(-i))
if(aib[i].first<val.first) aib[i]=val;
}
pair<int,int> query(int poz)
{
pair<int,int> s={0,0};
for(int i=poz;i>0;i-=i&(-i))
if(aib[i].first>s.first) s=aib[i];
return s;
}
const int Buffer=1<<20;
int poz_pars;
char pars[Buffer];
void inc()
{
if(++poz_pars==Buffer)
{
poz_pars=0;
fread(pars,1,Buffer,stdin);
}
}
int read()
{
int s=0;
for(;pars[poz_pars]<'0' or pars[poz_pars]>'9';inc());
for(;pars[poz_pars]>='0' && pars[poz_pars]<='9';inc()) s=s*10+pars[poz_pars]-'0';
return s;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
fread(pars,1,Buffer,stdin);
int ans=0,wh,l=0;
n=read();
for(int i=1;i<=n;i++)
{
v[i]=read();
q.push_back(v[i]);
}
sort(q.begin(),q.end());
for(int i=1;i<=n;i++)
{
int poz=lower_bound(q.begin(),q.end(),v[i])-q.begin()+1;
pair<int,int> s=query(poz-1);
s.first++;
tata[i]=s.second;
if(s.first>ans) {ans=s.first;wh=i;}
s.second=i;
update(poz,s);
}
printf("%d\n",ans);
for(;wh>0;wh=tata[wh]) v1[++l]=wh;
for(int i=l;i>=1;i--) printf("%d ",v[v1[i]]);
return 0;
}