Pagini recente » Cod sursa (job #1230378) | Cod sursa (job #2006825) | Rating Timofte Gabriel Sorin (sorinho13) | Cod sursa (job #1725519) | Cod sursa (job #1231674)
#include <cstdio>
#include <algorithm>
#define putere(x) (x)&(-x)
using namespace std;
struct structura
{
int x,poz;
bool operator <(const structura &aux) const
{
return x<aux.x;
}
}v1[100010],aib[100010],sol[100010],aux;
int v[100010],rez[100010],n,i,a,maxx,nr;
void aib_update(int x,int poz)
{
for(int i=poz;i<=n;i+=putere(i))
if(x>aib[i].x)
{
aib[i].x=x;
aib[i].poz=poz;
}
}
void aib_query(int poz)
{
aux.x=0;
for(int i=poz;i>0;i-=putere(i))
if(aux.x<aib[i].x)
{
aux.x=aib[i].x;
aux.poz=aib[i].poz;
}
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&v[i]);
v1[i].x=v[i];
v1[i].poz=i;
}
sort(v1+1,v1+1+n);
maxx=0;
for(i=1;i<=n;i++)
{
aib_query(v1[i].poz);
if(aux.x==0)
{
sol[v1[i].poz].x=1;
aib_update(1,v1[i].poz);
}
else
{
sol[v1[i].poz].x=aux.x+1;
sol[v1[i].poz].poz=aux.poz;
aib_update(aux.x+1,v1[i].poz);
}
if(maxx<sol[v1[i].poz].x)
{
maxx=sol[v1[i].poz].x;
a=v1[i].poz;
}
}
for(i=sol[a].x;i;i--)
{
if(nr==0 || v[a]<rez[nr]) rez[++nr]=v[a];
a=sol[a].poz;
}
printf("%d\n",nr);
for(i=nr;i;i--) printf("%d ",rez[i]);
return 0;
}