Pagini recente » Cod sursa (job #2529931) | Cod sursa (job #1667444) | Cod sursa (job #1118390) | Cod sursa (job #1956956) | Cod sursa (job #1162159)
#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;
struct nr
{
int val,poz;
bool operator < (const nr A) const
{
return val<A.val;
}
};
nr v[Nmax],aib[Nmax];
int N,a[Nmax],dp[Nmax],nxt[Nmax],sol[Nmax],t[Nmax];
inline void Normalizare()
{
int i;
sort(v+1,v+N+1);
a[v[1].poz]=1;
t[v[1].poz]=1;
for(i=2;i<=N;++i)
if(v[i].val==v[i-1].val)
{
a[v[i].poz]=a[v[i-1].poz];
t[v[i].poz]=i;
}
else
{
a[v[i].poz]=a[v[i-1].poz]+1;
t[v[i].poz]=i;
}
}
inline void Update(int x, nr w)
{
int i;
for(i=x;i<=N;i+=(i&(-i)))
if(w.val>aib[i].val)
aib[i]=w;
}
inline nr Query(int x)
{
int i;
nr w;
w.poz=w.val=0;
for(i=x;i>0;i-=(i&(-i)))
if(aib[i].val>w.val)
w=aib[i];
return w;
}
int main()
{
int i,maxim=0,poz;
nr w;
freopen ("scmax.in","r",stdin);
freopen ("scmax.out","w",stdout);
scanf("%d", &N);
for(i=1;i<=N;++i)
{
scanf("%d", &v[i].val);
v[i].poz=i;
}
Normalizare();
w.val=1; w.poz=1;
dp[1]=1; Update(a[1],w);
for(i=2;i<=N;++i)
{
w=Query(a[i]-1);
dp[i]=w.val+1;
nxt[i]=w.poz;
w.val=dp[i]; w.poz=i;
Update(a[i],w);
}
for(i=1;i<=N;++i)
if(dp[i]>maxim)
{
maxim=dp[i];
poz=i;
}
while(poz)
{
sol[++sol[0]]=v[t[poz]].val;
poz=nxt[poz];
}
printf("%d\n", maxim);
for(i=sol[0];i;--i)
printf("%d ", sol[i]);
printf("\n");
return 0;
}