Pagini recente » Cod sursa (job #3210504) | Cod sursa (job #2650982) | Cod sursa (job #2745587) | Cod sursa (job #1412026) | Cod sursa (job #730578)
Cod sursa(job #730578)
#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);
afisare(indice);
fclose(stdin);
fclose(stdout);
return 0;
}