Pagini recente » Cod sursa (job #2926249) | Cod sursa (job #1913074) | Cod sursa (job #1604372) | Cod sursa (job #398233) | Cod sursa (job #2174221)
#include <cstdio>
#include <algorithm>
using namespace std;
int n,v[100010],norm[100010],rez[100010];
pair<int,int> aib[100010],d[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)
{
fread(pars,1,Buffer,stdin);
poz_pars=0;
}
}
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);
//scanf("%d",&n);
n=read();
for(int i=1;i<=n;i++)
{
//scanf("%d",&v[i]);
v[i]=read();
norm[i]=v[i];
}
sort(norm+1,norm+n+1);
int sol=0,poz1;
for(int i=1;i<=n;i++)
{
int poz=lower_bound(norm+1,norm+n+1,v[i])-norm;
d[i]=query(poz-1);
d[i].first++;
if(d[i].first>sol) {sol=d[i].first;poz1=i;}
update(poz,{d[i].first,i});
}
printf("%d\n",sol);
int l=0;
while(poz1!=0)
{
rez[++l]=v[poz1];
poz1=d[poz1].second;
}
for(int i=l;i>=1;i--) printf("%d ",rez[i]);
return 0;
}