Pagini recente » Cod sursa (job #3137796) | Cod sursa (job #3337265) | Cod sursa (job #1471830) | Cod sursa (job #3307663) | Cod sursa (job #1129635)
#include <cstdio>
using namespace std;
int pozant[100021], valmin[100021], a[100021], lungime[100021], al_mai_mare, indice, poz[100021];
void afis (int i)
{
if (i>0)
{
afis(pozant[i]);
printf("%d ", a[i]);
}
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n;
scanf("%d", &n);
int i, li, lf, m;
for (i=1; i<=n; i++)
{
scanf("%d", &a[i]);
valmin[i]=2000000021;
}
valmin[1]=a[1];
pozant[1]=0;
poz[1]=1;
lungime[1]=1;
for (i=2; i<=n; i++)
{
li=1;
lf=i-1;
m=(li+lf+1)/2;
while (li<=lf)
if (valmin[m]>=a[i])
{
lf=m-1;
m=(li+lf+1)/2;
}
else
{
li=m+1;
m=(li+lf+1)/2;
}
lungime[i]=m;
if (valmin[m]>a[i])
{
valmin[m]=a[i];
poz[m]=i;
}
pozant[i]=poz[m-1];
}
for (i=1; i<=n; i++)
if (lungime[i]>al_mai_mare)
{
al_mai_mare=lungime[i];
indice=i;
}
printf("%d\n", al_mai_mare);
afis(indice);
return 0;
}