Pagini recente » Cod sursa (job #120008) | Cod sursa (job #1300289) | Cod sursa (job #1810225) | Cod sursa (job #1452241) | Cod sursa (job #1550486)
#define lsb(a) (a&-a)
#include <algorithm>
using namespace std;
#include<fstream>
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int NMAX = 100005;
int bit[NMAX],A[NMAX],norm[NMAX],res[NMAX],b[NMAX],pre[NMAX];
int rs,n;
void update(int x, int val)
{
for(; x<=n; x+=lsb(x)){
if(b[bit[x]] <= b[val])
bit[x]=val;
}
}
int query(int x)
{
int m=0;
for(;x; x-=lsb(x))
{
if(b[bit[x]] > b[m])
m=bit[x];
}
return m;
}
int main(void)
{
int h=1,i;
cin>>n;
for(i=1; i<=n; ++i){
cin>>A[i];
res[i] = norm[i] = A[i];
}
sort(norm+1, norm+1+n);
for(i=2; i<=n; ++i)
if(norm[i] != norm[h])
norm[++h] = norm[i];
for(i=1; i<=n; ++i)
A[i] = lower_bound(norm+1, norm+h+1, A[i]) - norm;
for(i=1; i<=n; ++i)
{
pre[i] = query(A[i]-1);
b[i] = b[pre[i]]+1;
update(A[i], i);
}
rs=0;
for(i=1; i<=n; ++i)
if(b[rs] < b[i])
rs=i;
cout<<b[rs]<<" \n";
for(h=0, i=rs; i; i=pre[i])
norm[++h]=res[i];
for(i=h; i; --i)
cout<<norm[i]<<" ";
return 0;
}