Pagini recente » Cod sursa (job #727946) | Cod sursa (job #1379896)
#include <cstdio>
#include <algorithm>
#include <vector>
#define ub(x) (x&(-x))
#define Nmax 100010
#define val first
#define poz second
using namespace std;
int n , i , sol , F , crt , ant;
int best[Nmax] , copie[Nmax] , start[Nmax] , SOL[Nmax] , a[Nmax];
int aib[Nmax];
bool ap[Nmax];
vector < int > v;
vector < int > :: iterator it;
void update(int x , int b)
{
for (int i = x; i <= n; i += ub(i))
aib[i] = max(aib[i] , b);
}
int inter(int x)
{
int i , sol = 0;
for (i = x; i >= 1; i -= ub(i))
sol = max(sol , aib[i]);
return sol;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for (i=1;i<=n;i++)
{
scanf("%d", &a[i]);
v.push_back(a[i]);
copie[i] = a[i];
}
sort(v.begin() , v.end());
it = unique(v.begin() , v.end());
v.resize(distance(v.begin() , it));
for (i = 1; i <= n; ++i)
a[i] = lower_bound(v.begin() , v.end() , a[i]) - v.begin() + 1;
for (i = 1; i <= n; ++i)
{
best[i] = inter(a[i]-1) + 1;
update(a[i] , best[i]);
}
for (i = 1; i <= n; ++i)
if (sol < best[i]) sol = best[i] , F = i;
printf("%d\n", sol);
SOL[++SOL[0]] = copie[F];
for (i = F; i ; --i)
if (best[i] == best[F]-1 && a[i] < a[F])
{
SOL[++SOL[0]] = copie[i];
F = i;
}
for (i = SOL[0]; i >= 1; --i) printf("%d ", SOL[i]);
return 0;
}