Pagini recente » Cod sursa (job #2436167) | Cod sursa (job #2454140) | Cod sursa (job #464888) | Cod sursa (job #483992) | Cod sursa (job #392977)
Cod sursa(job #392977)
using namespace std;
#include<stdio.h>
const int NMAX=100005;
int n, v[NMAX],x[NMAX], pred[NMAX], s[NMAX],lmax;/* v-elementele, x[i]=pozitia celui mai mic element
care poate fi ultimul intr-un subsir crescator de lungime i; pred[i]=pozitia predecesorului
elementului i in subsirul format; s[i]=lungimea celui mai lung subsir crescator maximal care
se poate forma avand ca ultim element v[i];*/
void RUinit()
{
freopen("scmax.in", "r",stdin);
freopen("scmax.out", "w",stdout);
scanf("%d", &n);
for(int i=1;i<=n;++i)
scanf("%d", &v[i]);
s[1]=1;x[1]=1;lmax=1;
}
int RUbin(int val)
{
int i,pas=1<<16;
for(i=0;pas;pas>>=1)
if(i+pas<=lmax &&v[x[i+pas]]<val )
i+=pas;
return i+1;
}
void RUrez()
{
int t;
for(int i=2;i<=n;++i)
{
t=RUbin(v[i]);
if(t>lmax)++lmax;
x[t]=i;
pred[i]=x[t-1];
}
}
int rec(int i)
{
if(pred[i])
rec(pred[i]);
printf("%d ", v[i]);
}
void RUafis()
{
int i=1;
printf("%d\n", lmax);
rec(x[lmax]);
}
int main()
{
RUinit();
RUrez();
RUafis();
return 0;
}