Pagini recente » Cod sursa (job #3275520) | Cod sursa (job #230650) | Cod sursa (job #2140574) | Cod sursa (job #513402) | Cod sursa (job #1224555)
#include <cstdio>
#include <vector>
#include <fstream>
#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()
{
//ifstream fin("scmax.in");
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%i", &n);
//fin>>n;
for(int i=1; i<=n; i++)
{
//fin>>a[i];
scanf("%i", &a[i]);
srted[i]=a[i];
}
}
int f(int x,int st,int dr)
{
//cautsre binara in srted
if(st==dr)
return st;
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]]);
}
}
void solutie(int k, int i)
{
if(k>0)
{
while(ht[i]!=k)
i--;
solutie(k-1, i);
printf("%i ", srted[i]);
}
}
int main()
{
read();
solve();
int sol=query(na);
printf("%i\n", sol);
//refacere solutie
solutie(sol, na);
return 0;
}