Pagini recente » Diferente pentru utilizator/apocalypto intre reviziile 192 si 191 | Istoria paginii utilizator/albert_prime | Diferente pentru utilizator/robertpoe intre reviziile 90 si 16 | Profil Vianu_Tulba_Rebegea_Pop | Cod sursa (job #2553670)
////#include <iostream>
//#include <fstream>
//using namespace std;
//ifstream cin("scmax.in");
//ofstream cout("scmax.out");
//const int N = 100003;
//int n ;
//int pozmax;
//int v[N], dp[N], urm[N];
//int main() {
// cin >> n;
// for( int i =1 ;i <=n;i++)
// cin >> v[i];
// dp[n] = 1; urm[n] = 0;
// for( int i = n - 1 ; i > 0 ; i--)
// {
// dp[i] = 1; urm[i] = 0;
// for( int j =i + 1 ;j <=n ;j ++)
// {
// if(v[i] < v[j] and dp[i] < dp[j] + 1)
// {
// dp[i] = 1 + dp[j];
// urm[i] = j;
// }
// }
// }
// /// det lungimea maxima
// int maxim = dp[1];
// pozmax = 1;
// for( int i = 2 ;i <=n;i ++)
// if(maxim < dp[i]){
// maxim = dp[i];
// pozmax = i;
// }
// cout << maxim<< '\n';
// /// afisez subsir cresc de lungime max
// int i = pozmax;
// while( i != 0)
// {
// cout << v[i]<<" ";
// i = urm[i];
// }
// return 0;
//}
#include <fstream>
//#include <iostream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int N = 1000001;
int n;
int lgbest;
int sol[N];
int poz[N], best[N], v[N];
int cauta( int x)
{
int inc = 0 , sf = lgbest + 1, mid;
while(sf - inc > 1)
{
int mid = (sf + inc) / 2;
if(best[mid] < x)
inc = mid;
else
sf = mid;
}
return sf;
}
int main()
{
cin >> n;
for( int i =1 ;i <=n;i ++)
cin >> v[i];
best[1] = v[1];
poz[1] = 1;
lgbest = 1;
int pozx;
for( int i =2 ;i <=n;i++)
{
if(v[i] > best[lgbest])
best[++lgbest] = v[i] , poz[i]= lgbest;
else
{
pozx = cauta(v[i]);
best[pozx] = v[i];
poz[i] = pozx;
}
}
///afisare
cout << lgbest<<'\n';
for(int i =lgbest, j = n; i > 0; j--)
{
if(poz[j] == i)
sol[i] = v[j] , i --;
}
for( int i =1 ;i <=lgbest ;i ++)
cout <<sol[i]<<" ";
}