Pagini recente » Cod sursa (job #42789) | Cod sursa (job #832053) | Cod sursa (job #1032044) | Cod sursa (job #2000188) | Cod sursa (job #2832992)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int const N = 1e5 + 3;
int n , v[N] , v2[N] , dp[N] , fr[N] , init[N];
int lg;
struct aib{
#define z(x) ((x)&(-x))
int v[N];
aib(){
fill(v , v + 1 + N , 0);
}
void update(int p , int x){
for(int i = p ; i <= n ; i += z(i))
if(dp[x] > dp[v[i]])
v[i] = x;
}
int query(int p){
int val = 0 , r = 0;
for(int i = p ; i ; i -= z(i)){
if(val < dp[v[i]]){
val = dp[v[i]];
r = v[i];
}
}
return r;
}
}t;
int main()
{
fin >> n;
for(int i = 1 ; i <= n ; ++ i)
fin >> v[i] , v2[i] = v[i] , init[i] = v[i];
sort(v2 + 1 , v2 + 1 + n);
for(int i = 1 ; i <= n ; ++ i){
v[i] = (lower_bound(v2 + 1 , v2 + 1 + n , v[i]) - v2);
int idx = t.query(v[i] - 1);
dp[i] = 1 + dp[idx];
fr[i] = idx;
lg = max(lg , dp[i]);
t.update(v[i] , i);
}
vector<int> ans;
fout << lg << '\n';
int p = (max_element(dp + 1 , dp + 1 + n) - dp);
function<void(int)> out = [&](int x){
if(x == 0)
return;
out(fr[x]);
fout << init[x] << ' ';
};
out(p);
fout << '\n';
return 0;
}