Pagini recente » Cod sursa (job #263384) | Cod sursa (job #1981306) | Cod sursa (job #1572385) | Cod sursa (job #2968113) | Cod sursa (job #1244397)
#include <fstream>
#include<algorithm>
#include<iostream>
using namespace std;
#define MX 100010
int v[MX],res[MX] , lst[MX],aib[MX],d[MX],up[MX],n,i, k ;
ifstream f1("scmax.in");
ofstream f2("scmax.out");
void update(int x,int ind)
{
for (;x<=n;x+=x^((x-1)&x) )
if (d[ind]>d[aib[x] ] )
aib[x]=ind;
}
int query(int x)
{
int mx=0;
for ( ;x; x-=x^((x-1)&x ) )
if (d[aib[x] ]>d[mx] ) mx=aib[x];
return mx;
}
int low_b(int a, int b,int v)
{
int m=(a+b)/2;
if (lst[m]==v) return m;
if (v<lst[m] ) return low_b(a,m,v);
else return low_b(m+1,b,v);
}
int main()
{
f1>>n;
for (i=1;i<=n;i++)
{f1>>v[i]; lst[i]=res[i]=v[i]; }
sort(lst+1,lst+n+1);
for (i=2,k=1 ; i<=n; i++)
if (lst[k]!=lst[i] )
lst[++k]=lst[i];
for (i=1; i<=n;i++)
v[i]=low_b(1,k,v[i]);
for (i=1; i<=n;i++)
{ up[i]= query(v[i]-1);
d[i]=d[up[i] ]+1;
update(v[i],i);
}
int pm=1;
for (i=2;i<=n;i++)
if (d[i]>d[pm]) pm=i;
for (i=pm; i>0; i=up[i] )
lst[d[i]]=i;
f2<<d[pm]<<"\n";
for (i=1;i<=d[pm];i++ )
f2<<res[lst[i] ]<<" ";
f2.close();
return 0;
}