Pagini recente » Cod sursa (job #2844270) | Cod sursa (job #2251871) | Cod sursa (job #2786594) | Cod sursa (job #1003488) | Cod sursa (job #724692)
Cod sursa(job #724692)
#include<cstdio>
#define nmax 100010
using namespace std;
int n,v[nmax],P[nmax],S[nmax],L[nmax],poz,nr,max;
void citeste(),rezolva(),afiseaza(int);
int main()
{
citeste();
rezolva();
return 0;
}
void citeste()
{
int i;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for(i=1;i<=n;i++)
scanf("%d", &v[i]);
}
void rezolva()
{
int i,first,last,middle;
S[1]=L[1]=1;
nr=1;
for(i=2;i<=n;i++)
{
first=0;
last=nr;
poz=-1;
middle=(first+last)/2;
for(;first<=last;)
{
if(v[L[middle]]<v[i]&&v[L[middle+1]]>=v[i])
{
poz=middle;
break;
}
if(v[L[middle+1]]<v[i])
{
first=middle+1;
middle=(first+last)/2;
}
else
{
last=middle-1;
middle=(first+last)/2;
}
}
if(poz==-1)
poz=nr;
P[i]=L[poz];
S[i]=poz+1;
L[poz+1]=i;
if(nr<poz+1)
nr=poz+1;
}
poz=0;
for(i=1;i<=n;i++)
if(S[i]>max)
{
max=S[i];
poz=i;
}
printf("%d\n", max);
afiseaza(poz);
}
void afiseaza(int k)
{
if(P[k]>0)
afiseaza(P[k]);
printf("%d ", v[k]);
}