Pagini recente » Cod sursa (job #3269790) | Cod sursa (job #3245542) | Cod sursa (job #3265632) | Cod sursa (job #2462770) | Cod sursa (job #665346)
Cod sursa(job #665346)
#include<cstdio>
using namespace std;
int n,i,best,sol,V[100010],L[100010],P[100010],search(int);
void read(),solve(),afis(int);
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",V+i);
}
void solve()
{
for(i=1;i<=n;i++)
{
best=search(V[i]);
P[i]=L[best];
if(best==sol || V[i]<V[L[best+1]])
{
L[best+1]=i;
if(sol<best+1)sol=best+1;
}
}
printf("%d\n",sol);
afis(L[sol]);
}
int search(int x)
{
int p=1,u=sol,m;
while(p<=u)
{
m=(p+u)/2;
if(x>V[L[m]] && (x<=V[L[m+1]] || L[m+1]==0))return m;
if(x<=V[L[m]])u=m-1;
else p=m+1;
}
return 0;
}
void afis(int poz)
{
if(P[poz])afis(P[poz]);
printf("%d ",V[poz]);
}