Pagini recente » Cod sursa (job #1291050) | Cod sursa (job #2509146) | Cod sursa (job #251343) | Cod sursa (job #2308141) | Cod sursa (job #1736346)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100005
using namespace std;
ifstream si("scmax.in");
ofstream so("scmax.out");
int n,res[NMAX],v[NMAX],lst[NMAX],d[NMAX],aib[NMAX],pr[NMAX];
void upd(int x,int i)
{
for(;x<=n;x+=x&(-x))
if(d[i]>d[aib[x]])
aib[x]=i;
}
int query(int x)
{
int sx=0;
for(;x;x-=x&(-x))
if(d[aib[x]]>d[sx])
sx=aib[x];
return sx;
}
int main()
{
si>>n;
int i,m,sol;
for(i=1;i<=n;++i)
{
si>>v[i];
res[i]=lst[i]=v[i];
}
sort(lst+1,lst+n+1);
m=1;
for(i=2;i<=n;++i)
if(lst[i]!=lst[m])
lst[++m]=lst[i];
for(i=1;i<=n;++i)
v[i]=lower_bound(lst+1,lst+m+1,v[i])-lst;
for(i=1;i<=n;++i)
{
pr[i]=query(v[i]-1);
d[i]=d[pr[i]]+1;
upd(v[i],i);
}
sol=0;
for(i=1;i<=n;++i)
{
if(d[sol]<d[i])
sol=i;
}
so<<d[sol]<<'\n';
for(m=0;sol;sol=pr[sol])
{
lst[++m]=res[sol];
}
while(m)
so<<lst[m--]<<' ';
so.close();
return 0;
}