Pagini recente » Cod sursa (job #999891) | Cod sursa (job #488684) | Cod sursa (job #595600) | Cod sursa (job #983019) | Cod sursa (job #798300)
Cod sursa(job #798300)
#include <stdio.h>
FILE *fin,*fout;
long i,n,v[100002],b[100002],p[100002],l[100002],max,poz,nr;
int cautare(int x)
{
int p, u, m;
p = 0;
u = nr;
m = (p+u)/2;
while (p <= u)
{
if ((v[l[m]] < x )&&(v[l[m+1]] >= x)) return m;
else if (v[l[m+1]] < x)
{
p = m + 1;
m = (p + u)/2;
}
else
{
u = m - 1;
m = (p + u)/2;
}
}
return nr;
}
void afisare(int i)
{
if (p[i] > 0)
{
afisare(p[i]);
}
fprintf(fout,"%ld ",v[i]);
}
int main()
{
fin=fopen("scmax.in","r");
fscanf(fin,"%ld",&n);
for(i=1; i<=n; i++)
{
fscanf(fin,"%ld",&v[i]);
}
b[1]=1;
l[1]=1;
l[0]=0;
for(i=2; i<=n; i++)
{
poz=cautare(v[i]);
p[i]=l[poz];
b[i]=poz+1;
l[poz+1]=i;
if(nr<poz+1)
{
nr=poz+1;
}
}
max=0;
poz=0;
for(i=1; i<=n; i++)
{
if (max<b[i])
{
max=b[i];
poz=i;
}
}
fout=fopen("scmax.out","w");
fprintf(fout,"%ld\n",max);
afisare(poz);
return 0;
}