Pagini recente » Cod sursa (job #241607) | Cod sursa (job #709438) | Cod sursa (job #1571013) | Cod sursa (job #1803517) | Cod sursa (job #1830159)
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,nr,inc,u,m,v[100003],best[100003],p[100003],q[100003];
int caut(int x)
{
inc=0;
u=nr;
m=(inc+u)/2;
while(inc<=u)
{
if(v[q[m]]<x and v[q[m+1]]>=x)
return m;
else
{
if(v[q[m+1]]<x)
{
inc=m+1; m=(inc+u)/2;
}
else
{
u=m-1; m=(inc+u)/2;
}
}
}
return nr;
}
void afis(int x)
{
if(p[x]>0) afis(p[x]);
g<<v[x]<<" ";
}
int main()
{
int i,poz;
f>>n;
for(i=1;i<=n;i++)
f>>v[i];
best[1]=q[1]=1;
q[0]=0;
nr=1;
for(i=2;i<=n;i++)
{
poz=caut(v[i]);
p[i]=q[poz];
best[i]=poz+1;
q[poz+1]=i;
if(poz+1>nr)
{
nr+=1;
q[nr]=i;
}
}
int maxim=0;
nr=0;
for(i=1;i<=n;i++)
{
if(maxim<best[i])
{
maxim=best[i];
nr=i;
}
}
g<<maxim<<'\n';
afis(nr);
f.close();
g.close();
return 0;
}