Pagini recente » Cod sursa (job #465818) | Cod sursa (job #1852212) | Cod sursa (job #1556738) | Cod sursa (job #1929469) | Cod sursa (job #2698869)
#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];
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(v[i] > v[i-1])
++cnt;
mp[v[i]] = cnt;
}
int mx_ans = 0;
for(int i = 1; i <= n; ++i)
{
ans[i] = query(mp[v[i]] - 1) + 1;
upd(mp[v[i]], ans[i]);
mx_ans = max(mx_ans, ans[i]);
}
cout << mx_ans << '\n';
vector<int> vans;
int prv = (1<<30);
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];
reverse(vans.begin(), vans.end());
for(int i = 0; i < (int) vans.size(); ++i)
cout << vans[i] << " ";
return 0;
}