Pagini recente » Borderou de evaluare (job #328278) | Borderou de evaluare (job #2797094) | Cod sursa (job #715430) | Borderou de evaluare (job #2771414) | Cod sursa (job #921176)
Cod sursa(job #921176)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[100001], dp[100001], c[100001], sol[100001];
int Caut(int x, int st, int dr)
{
int poz = dr+1;
while ( st <= dr)
{
int m = (st+dr)/2;
if ( x <= c[m] )
dr = m-1, poz = m;
else st = m+1;
}
return poz;
}
int main()
{
fin >> n;
for ( int i = 1; i<= n; i++ )
fin >> a[i];
int sz=1;
c[1] = a[1];
dp[1]=1;
for ( int i = 2; i<= n; i++ )
{
int k = Caut(a[i],1,sz);
if(k<=sz)
c[k]=a[i],dp[i]=k;
else c[++sz]=a[i],dp[i]=sz;
}
fout<<sz<<'\n';
int nr=sz;
for(int i = n ;i; i-- )
if ( dp[i]==sz )
c[sz--]=a[i];;
for ( int i=1; i<=nr; i++ )
fout<<c[i] << ' ';
fin.close();
fout.close();
return 0;
}