Pagini recente » Cod sursa (job #238202) | Cod sursa (job #429453) | Cod sursa (job #1752194) | Cod sursa (job #1029847) | Cod sursa (job #1224559)
#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]=rff[i]=a[i];
}
}
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);
rff[i]=lower_bound(srted+1, srted+na+1, rff[i])-srted;
}
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;
}