Pagini recente » Cod sursa (job #1916139) | Cod sursa (job #3243459) | Cod sursa (job #871576) | Cod sursa (job #50074) | Cod sursa (job #750468)
Cod sursa(job #750468)
#include<cstdio>
#define inf 2000000010
using namespace std;
int i, a[100001], p[100001], q[100001], n, m;
int cb(int x, int st, int dr)
{
int mij, pz;
pz=0;
while ((st<=dr)&&(pz==0))
{
mij=(st+dr)/2;
if (q[mij]==x) pz=mij;
else if (q[mij]<x) st=mij+1;
else dr=mij-1;
}
if (pz==0) return st;
else return pz;
}
void scrie(int poz, int x, int ult)
{
if (poz>0)
{
if ((p[poz]==x)&&(ult>a[poz]))
{
scrie(poz-1, x-1, a[poz]);
printf("%d ", a[poz]);
}
else scrie(poz-1, x, ult);
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for (i=1; i<=n; i++)
{
scanf("%d", &a[i]);
p[i]=0;
q[i]=0;
}
p[1]=1;
q[0]=1;
q[1]=a[1];
for (i=2; i<=n; i++)
{
m=cb(a[i], 1, q[0]);
if (m>q[0])
{
q[0]++;
p[i]=q[0];
q[q[0]]=a[i];
}
else
{
q[m]=a[i];
p[i]=m;
}
}
printf("%d\n", q[0]);
scrie(n, q[0], inf);
return 0;
}