Pagini recente » Cod sursa (job #978282) | Cod sursa (job #360264) | Cod sursa (job #626280) | Cod sursa (job #2554362) | Cod sursa (job #730579)
Cod sursa(job #730579)
#include <stdio.h>
#include <algorithm>
#define f(x) ((x^(x - 1)) & x)
using namespace std;
const int MAX = 100050;
int n, v[MAX], nrm[MAX], res[MAX], up[MAX], aib[MAX], d[MAX], maxim, indice;
inline int query(int x)
{
int mx = 0;
for(;x; x -= f(x))
if(d[aib[x]] > d[mx])
mx = aib[x];
return mx;
}
inline void update(int x, int poz)
{
for(;x <= n; x += f(x))
if(d[poz] > d[aib[x]])
aib[x] = poz;
}
void afisare(int i)
{
if(!i)
{
return;
}
afisare(up[i]);
printf("%d ", res[i]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d", &v[i]);
nrm[i] = res[i] = v[i];
}
sort(nrm + 1, nrm + n + 1);
int h = 1;
for(int i = 2; i <= n; i++)
if(nrm[i] != nrm[h])
nrm[++h] = nrm[i];
for(int i = 1; i <= n; i++)
v[i] = lower_bound(nrm + 1, nrm + h + 1, v[i]) - nrm;
for(int i = 1; i <= n; i++)
{
up[i] = query(v[i] - 1);
d[i] = d[up[i]] + 1;
update(v[i], i);
if(d[i] > maxim)
{
maxim = d[i];
indice = i;
}
}
printf("%d\n", maxim);
h = 0;
for(; indice; indice = up[indice])
nrm[++h] = res[indice];
for(int i = h; i; --i)
printf("%d ", nrm[i]);
fclose(stdin);
fclose(stdout);
return 0;
}