Pagini recente » Cod sursa (job #2648130) | Cod sursa (job #2903877) | Cod sursa (job #2331503) | Cod sursa (job #34898) | Cod sursa (job #2698876)
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define fisier 1
using namespace std;
typedef long long ll;
const int mod = 1000000007;
const double dancila = 3.14159265359; // PI
const double eps = 1e-9;
int n, v[200002], vs[200002], ans[200002];
unordered_map<int, int> mp;
int aib[200002];
void upd(int poz, int val)
{
for(; poz <= n; poz += (poz & (-poz)))
aib[poz] = max(aib[poz], val);
}
int query(int poz)
{
int ans = 0;
for(; poz; poz -= (poz & (-poz)))
ans = max(ans, aib[poz]);
return ans;
}
int main()
{
#ifdef fisier
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> v[i], vs[i] = v[i];
sort(vs+1, vs+n+1);
int cnt = 0;
for(int i = 1; i <= n; ++i)
{
if(vs[i] > vs[i-1])
++cnt;
mp[vs[i]] = cnt;
}
int mx_ans = 0;
for(int i = 1; i <= n; ++i)
{
int val = mp[v[i]];
ans[i] = query(val - 1) + 1;
upd(val, ans[i]);
mx_ans = max(mx_ans, ans[i]);
}
cout << mx_ans << '\n';
vector<int> vans;
int prv = 2000000001;
for(int i = n; i >= 1; --i)
if(ans[i] == mx_ans && v[i] < prv)
vans.push_back(v[i]), --mx_ans, prv = v[i];
for(int i = vans.size() - 1; i >= 0; --i)
cout << vans[i] << " ";
return 0;
}