Pagini recente » Cod sursa (job #2845987) | Cod sursa (job #778368) | Cod sursa (job #2559377) | Cod sursa (job #2558365) | Cod sursa (job #440550)
Cod sursa(job #440550)
/*
a[] -> numere din sir
lung[i] -> lung celui mai lung subsir care se termina cu a[i]
*/
#include<cstdio>
const int N=1<<17;
int a[N],lung[N],pred[N];
void scrie(int i)
{
if (i==0) return ;
scrie(pred[i]);
printf("%d ",a[i]);
}
void cautbin(int x)
{
int i,pas=1<<17;
for (i=0;pas;pas>>=1)
if (i+pas<x && lung[i+pas]>lung[x] && a[i+pas]<a[x])
{
i+=pas;
lung[x]=lung[i];
pred[x]=i;
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
lung[1]=1;
int max=1,poz=1;
for (int i=2;i<=n;i++)
{
/*for (int j=1;j<i;j++)
if (lung[j]>lung[i] && a[j]<a[i])
{
lung[i]=lung[j];
pred[i]=j;
}
*/
cautbin(i);
lung[i]++;
if (lung[i]>max)
{
max=lung[i];
poz=i;
}
}
printf("%d\n",max);
scrie(poz);
return 0;
}