Pagini recente » Cod sursa (job #2857955) | Cod sursa (job #2064277) | Cod sursa (job #2287969) | Cod sursa (job #2623065) | Cod sursa (job #1527794)
#include <iostream>
#include <cstdio>
using namespace std;
const int dmax = 100000;
int a[dmax+1];
int best[dmax+1]; // best[i] = LUNGIMEA MAX A UNUI SUBSIR CARE SE TERMINA PE POZITIA i
int pre[dmax+1]; // pre[i] = POZITIA VALORII ANTERIOARE ELEMENTULUI a[i] DIN SUBSIRUL CARE SE TERMINA PE POZITIA i
int N, L_max;
void calcul(int p)
{
if(pre[p] == -1) { printf("%d ", a[p]); return; }
calcul(pre[p]);
printf("%d ", a[p]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int p;
scanf("%d", &N);
for(int i = 1; i <= N; i++) scanf("%d", &a[i]);
best[1] = 1; L_max = 1;
pre[1] = -1;
for(int i = 2; i <= N; i++)
{
best[i] = 1;
pre[i] = -1;
for(int j = 1; j < i; j++)
{
if(best[i] < 1 + best[j] && a[i] > a[j])
{
best[i] = 1 + best[j];
pre[i] = j;
if(L_max < best[i]) { L_max = best[i]; p = i; }
}
}
}
printf("%d\n", L_max);
calcul(p);
return 0;
}