Pagini recente » Cod sursa (job #2126202) | Cod sursa (job #3272497) | Cod sursa (job #2867789) | Cod sursa (job #2893026) | Cod sursa (job #2870116)
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAXN 100001
#define zeros(x) ((x ^ (x-1)) & x)
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,v[MAXN],dp[MAXN],afis[MAXN],maxl,aib[4*MAXN],besti[MAXN],from[MAXN],l[MAXN],r[MAXN],h=1;
void update (int x,int ind)
{
for (x; x<=n; x+=zeros(x))
{
if (besti[ind]>besti[aib[x]])
{
aib[x]=ind;
}
}
}
int query (int x)
{
int max1=0;
for (x; x>0; x-=zeros(x))
{
if (besti[max1]<besti[aib[x]])
{
max1=aib[x];
}
}
return max1;
}
int main()
{
f>>n;
for (int i=1; i<=n; i++)
{
f>>v[i];
r[i]=l[i]=v[i];
//update(1,1,n,i);
}
sort(l+1,l+1+n);
for (int i=2; i<=n; i++)
{
if (l[i]!=l[h])
{
++h;
l[h]=l[i];
}
}
for (int i=1; i<=n; i++)
{
v[i]=lower_bound(l+1,l+1+h,v[i])-l;
//cout<<v[i]<<' ';
}
dp[1]=1;
for (int i=1; i<=n; i++)
{
int max1=0;
from[i]=query(v[i]-1);
besti[i]=besti[from[i]]+1;
update(v[i],i);
/*for (int j=i-1; j>=1; j--)
{
if (v[i]>v[j])
max1=max(max1,dp[j]);
}*/
//cout<<val<<'\n';
//dp[i]=val+1;
//maxl=max(maxl,besti[i]);
if (besti[maxl]<besti[i])
maxl=i;
}
g<<besti[maxl]<<'\n';
int l=besti[maxl];
for (int i=maxl; i; i=from[i])
{
afis[l]=r[i];
l--;
}
for (int i=1; i<=besti[maxl]; i++)
g<<afis[i]<<' ';
/*for (int i=n; i>=1; i--)
{
if (dp[i]==l)
{
afis[l]=v[i];
l--;
}
}
for (int i=1; i<=maxl; i++)
g<<afis[i]<<' ';*/
return 0;
}