Pagini recente » Cod sursa (job #82329) | Cod sursa (job #889815) | Cod sursa (job #2344987) | Cod sursa (job #2410322) | Cod sursa (job #221989)
Cod sursa(job #221989)
#include <cstdio>
#define MAX_N 100005
int V[MAX_N], ant[MAX_N], L[MAX_N], P[MAX_N];
int N, nr;
inline int maxim(int a, int b)
{
return (a > b)? a : b;
}
int find(int x)
{
int log, i, lg;
for(log = 1; log <= nr; log <<= 1);
for(i = nr, lg = log; lg; lg >>= 1)
if(i - lg >= 0 && V[P[i - lg + 1]] >= x)
i -= lg;
return i;
}
void afisare(int i)
{
if(ant[i]) afisare(ant[i]);
printf("%d ",V[i]);
}
void find_scmax()
{
int max = 0, poz;
P[0] = 0;
L[1] = P[1] = 1;
nr = 1;
for(int i = 2; i <= N; ++i)
{
poz = find(V[i]);
ant[i] = P[poz];
L[i] = poz+1;
P[poz + 1] = i;
nr = maxim(nr, poz+1);
}
for(int i = 1; i <= N; ++i)
{
if(L[i] > max)
max = L[i], poz = i;
}
printf("%d\n", max);
afisare(poz);
}
int main()
{
freopen("scmax.in","rt",stdin);
freopen("scmax.out","wt",stdout);
scanf("%d",&N);
for(int i = 1; i <= N; ++i)
scanf("%d",V+i);
find_scmax();
}