Pagini recente » Cod sursa (job #57536) | Cod sursa (job #528348) | Borderou de evaluare (job #897029) | Cod sursa (job #612202) | Cod sursa (job #699424)
Cod sursa(job #699424)
#include<stdio.h>
#define nmax 100005
struct element{long val, poz;};
long st, dr, m, v[nmax], n, poz, an[nmax], lg[nmax], rez, pozrez, i, ne, nrez;
element a[nmax];
void cautare()
{
st=1; dr=ne;
while (st<=dr)
{
m=(st+dr)/2;
if (a[m].val<v[i])
st=m+1;
else
dr=m-1;
}
poz=st;
}
void rezolvare()
{
for (i=1;i<=n;i++)
{
cautare();
a[poz].val=v[i]; a[poz].poz=i;
lg[i]=poz; an[i]=a[poz-1].poz;
if (poz>ne)
ne++;
if (lg[i]>rez)
{ rez=lg[i]; pozrez=i; }
}
}
void afisare()
{
printf("%ld\n",rez);
while (pozrez>0)
{ lg[++nrez]=v[pozrez]; pozrez=an[pozrez]; }
for (i=nrez;i>=1;i--)
printf("%ld ",lg[i]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++)
scanf("%ld",&v[i]);
rezolvare();
afisare();
return 0;
}