Pagini recente » Cod sursa (job #1838330) | Cod sursa (job #330503) | Cod sursa (job #2122147) | Istoria paginii runda/ichb/clasament | Cod sursa (job #2731164)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
int v[100001] , dp[100001] , ind[100001] , ans[100001];
int next_pos(int x , int k){
int start = 1;
int finish = k;
int pos = 0;
while(start <= finish){
int m = (start + finish) / 2;
if(dp[m] > x){
finish = m - 1;
pos = m;
}
else start = m + 1;
}
return pos;
}
int main()
{
f>>n;
for(int i = 1; i <= n; ++i){
f>>v[i];
}
int k = 1;
dp[1] = v[1];
ind[1] = 1;
for(int i = 2 ; i <= n ; ++i){
if(v[i] > dp[k]){
dp[++k] = v[i];
ind[i] = k;
}
else{
int pos = next_pos(v[i] , k);
dp[pos] = v[i];
ind[i] = pos;
}
}
g<<k<<endl;
int j = n;
for(int i = k ; i >= 1 ; --i){
while(ind[j] != i){
--j;
}
ans[i] = v[j];
}
for(int i = 1 ; i <= k ; ++i){
g<<ans[i]<<" ";
}
return 0;
}