Pagini recente » Cod sursa (job #2330303) | Cod sursa (job #1598347) | Cod sursa (job #2671013) | Cod sursa (job #686002) | Cod sursa (job #1508503)
#include <cstdio>
#include <algorithm>
using namespace std;
struct inaib
{
int s,poz;
inaib(int s1=0,int poz1=0) {s=s1;poz=poz1;}
}aib[100010],d[100010];
int v[100010],norm[100010],sol[100010],n;
int poz_norm(int x)
{
return lower_bound(norm+1,norm+1+n,x)-norm;
}
void aib_update(int i,int s,int poz)
{
for(;i<=n;i+=i&(-i))
if(s>aib[i].s) aib[i]=inaib(s,poz);
}
inaib aib_query(int i)
{
inaib sol;
for(;i>0;i-=i&(-i))
if(aib[i].s>sol.s) sol=aib[i];
return sol;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int nr=0,maxx=0,poz;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
norm[i]=v[i];
}
sort(norm+1,norm+1+n);
for(int i=1;i<=n;i++)
{
d[i]=aib_query(poz_norm(v[i])-1);
d[i].s++;
aib_update(poz_norm(v[i]),d[i].s,i);
if(d[i].s>maxx) {maxx=d[i].s;poz=i;}
}
for(int i=poz;i>0;i=d[i].poz)
sol[++nr]=v[i];
printf("%d\n",nr);
for(int i=nr;i;i--) printf("%d ",sol[i]);
return 0;
}