Pagini recente » Cod sursa (job #1958964) | Cod sursa (job #1606321) | Cod sursa (job #1410143) | Cod sursa (job #158727) | Cod sursa (job #828808)
Cod sursa(job #828808)
//Vasilut
#include<fstream>
#include<algorithm>
#define NN 100010
using namespace std;
ofstream out("scmax.out");
int n,v[NN],l[NN],p[NN],bst[NN],number;
void read();
int cauta(int);
void solve();
void write_sol(int);
int main()
{
read();
solve();
return 0;
}
void read()
{
ifstream in("scmax.in");
in>>n;
for(int i=1;i<=n;i++)
in>>v[i];
bst[1]=l[1]=1;
l[0]=0;
number=1;
}
int cauta(int x)
{
int st,dr,mid;
st = 0;
dr = number;
mid = ( st + dr ) >> 1 ;
while( st <= dr )
{
if ( v[ l[mid] ] < x && v[ l[mid+1] ] >=x )
return mid;
else
if ( v[ l[ mid+1 ] ] < x )
{
st = mid + 1;
mid = ( st + dr ) >> 1;
}
else
{
dr =mid - 1;
mid = ( st + dr ) >> 1;
}
}
return number;
}
void solve()
{
for(int i=1 ; i<=n ; i++ )
{
int poz = cauta ( v[i] );
p[i] = l[ poz ];
bst[ i ] = poz + 1;
l [ poz + 1 ] = i;
if ( number < poz + 1 )
number = poz + 1;
}
int maxx ,poz ;
maxx = poz = 0;
for (int i =1 ;i<=n ;i++ )
if ( bst[i] > maxx )
{
maxx = bst[i];
poz = i;
}
out<<maxx<<'\n';
write_sol(poz);
}
void write_sol(int i)
{
if ( p[i] )
write_sol( p[i] );
out<<v[i]<< " " ;
}