Pagini recente » Cod sursa (job #393943) | Cod sursa (job #3286082) | Cod sursa (job #1257592) | Cod sursa (job #1072829) | Cod sursa (job #1224546)
#include <cstdio>
#include <vector>
#include <algorithm>
#define last2(a) ((a^(a-1))+1)>>1
#define dmax 100001
using namespace std;
int a[dmax], sol[dmax], n, poz[dmax], s;
int srted[dmax], rff[dmax], ht[dmax], aib[dmax];
int na;
int query(int x)
{
int maxx=0;
while(x>0)
{
if(maxx<aib[x])
maxx=aib[x];
x-=last2(x);
}
return maxx;
}
void update(int p, int v)
{
while(p<=na)
{
if(v>aib[p])
aib[p]=v;
p+=last2(p);
}
}
void read()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%i", &n);
for(int i=1; i<=n; i++)
{
scanf("%i", &a[i]);
srted[i]=a[i];
}
}
int f(int x,int st,int dr)
{
//cautsre binara in srted
int mid=(st+dr)/2;
if(x==srted[mid])
return mid;
else if(x>srted[mid])
f(x, mid+1, dr);
else if(x<srted[mid])
f(x, st, mid);
}
void solve()
{
sort(srted+1, srted+n+1);
int h=1;
for(int i=2; i<=n; i++)
if(srted[h]!=srted[i])
srted[++h]=srted[i];
na=h;
for(int i=1; i<=n; i++)
{
rff[i]=f(a[i], 1, na);
}
for(int i=1; i<=n; i++)
{
ht[rff[i]]=query(rff[i]-1)+1;
update(rff[i], ht[rff[i]]);
}
/*
//for(int i=1;i<=n;i++)
//sol[i]=1;
for(int i=1; i<=n; i++)
{
int amax=1;
for(int j=1; j<i; j++)
if(a[j]<a[i] && sol[j]+1>amax)
amax=sol[j]+1, poz[i]=j;
if(amax>sol[s])
s=i;
sol[i]=amax;
}
*/
}
int main()
{
read();
solve();
int sol=query(na);
printf("%i\n", sol);
//refacere solutie
for(int i=na;i>=0 && sol>0;--i)
{
if(ht[i]==sol)
{
printf("%i ", srted[i]);
--sol;
}
}
/*
//afisarea rezultatului
printf("%i\n", sol[s]);
int i=s;
vector <int> solf;
while(i!=0)
{
//printf("%i ", a[i]);
solf.push_back(a[i]);
i=poz[i];
}
int g=solf.size();
for(int i=g-1; i>=0; i--)
{
printf("%i ", solf[i]);
}
printf("\n");*/
return 0;
}