Pagini recente » Cod sursa (job #753081) | Cod sursa (job #2761706)
#include <fstream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int n, i, dp[100001], v[100001], ultim[100001], maxi, pre[100001], imax, pozi[100001];
int cb(int x, int n)
{
int pw=1;
while(pw<=n)
pw*=2;
pw/=2;
int pos=0;
while(pw)
{
if(pos+pw<=n)
if(ultim[pos+pw]>x)
pos+=pw;
pw/=2;
}
return pos;
}
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
fin>>v[i];
ultim[1]=v[n];
pozi[1]=n;
dp[n]=1;
for(int i=n-1; i>=1; i--)
{
int poz=cb(v[i], n);
if(poz==0)
{
dp[i]=1;
if(ultim[1]<v[i])
{
pozi[1]=i;
ultim[1]=v[i];
}
}
else
{
dp[i]=poz+1;
pre[i]=pozi[poz];
if(v[i]>ultim[poz+1])
{
ultim[poz+1]=v[i];
pozi[poz+1]=i;
}
}
if(dp[i]>maxi)
{
maxi=dp[i];
imax=i;
}
}
fout<<maxi<<'\n';
int i=imax;
while(pre[i]!=0)
{
fout<<v[i]<<' ';
i=pre[i];
}
fout<<v[i];
return 0;
}