Pagini recente » Cod sursa (job #3151793) | Cod sursa (job #2792254) | Cod sursa (job #926063) | Cod sursa (job #303678)
Cod sursa(job #303678)
#include<fstream.h>
int P[100001],M[100001],L,a[100001],i=1,j,N,s[100001];
inline int max(int x,int y)
{return x>y?x:y;}
int caut(int i)
{int s=0,d=L,m=L/2;
while(s<=d)
{if(a[M[m]]<a[i]&&a[M[m+1]]>=a[i]) return m;
if(a[M[j]]<a[i])d=m-1;
else s=m+1;
m=(s+d)/2;
}
return L;//return 0 conform wiki
}
int main()
{ifstream f("scmax.in");
ofstream g("scmax.out");
f>>N;
for(;i<=N;++i)
f>>a[i];
for(i=1;i<=N;++i)
{j=caut(i);
P[i]=M[j];//un if in wiki dupa acest rand ce include ultimele 2 instructiuni
M[j+1]=i;
L=max(L,j+1);
}
g<<L<<'\n';
for(i=L,j=M[L];i;--i)
{s[i]=a[j];
j=P[j];}
for(i=1;i<=L;++i)
g<<s[i]<<' ';
return 0;
}