Pagini recente » Cod sursa (job #692495) | Cod sursa (job #1736351)
#include <cstdio>
#include <algorithm>
#define NMAX 100005
using namespace std;
FILE*si=fopen("scmax.in","r");
FILE*so=fopen("scmax.out","w");
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-1) & x)
if(d[i]>d[aib[x]])
aib[x]=i;
}
int query(int x)
{
int sx=0;
for(;x;x-=x^(x-1) & x)
if(d[aib[x]]>d[sx])
sx=aib[x];
return sx;
}
int main()
{
fscanf(si,"%i",&n);
int i,m,sol;
for(i=1;i<=n;++i)
{
fscanf(si,"%i",&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;
}
fprintf(so,"%i\n",d[sol]);
for(m=0;sol;sol=pr[sol])
{
lst[++m]=res[sol];
}
while(m)
fprintf(so,"%i ",lst[m--]);
fclose(so);
return 0;
}