Pagini recente » Cod sursa (job #2385810) | Cod sursa (job #2568365) | Cod sursa (job #3215377) | Cod sursa (job #2553004) | Cod sursa (job #2478382)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,a[100100],best[100100],p[100100],lp[100100],Max,last,k,poz;
void afisare(int last)
{
if(last>0) {
afisare(p[last]);
out<<a[last]<<" ";
}
}
int cauta(int x)
{
int ans=0;
int l=0,r=k,m;
while(l<=r)
{
m=(l+r)/2;
if(a[lp[m]]<x)
{
ans=max(ans,m);
l=m+1;
}
else r=m-1;
}
return ans;
}
int main()
{
in>>n;
for(int i=1;i<=n;i++) in>>a[i];
best[1]=1;
lp[1]=1;
lp[0]=0;
k=1;
for(int i=2;i<=n;i++)
{
poz=cauta(a[i]);
p[i]=lp[poz];
best[i]=poz+1;
lp[poz+1]=i;
if(k<poz+1) k=poz+1;
}
for(int i=1;i<=n;i++)
if(best[i]>Max)
{
Max=best[i];
last=i;
}
out<<Max<<'\n';
afisare(last);
return 0;
}