Cod sursa(job #2698869)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 23 ianuarie 2021 10:56:14
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#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;
}