Cod sursa(job #2577361)

Utilizator valen.valentinValentin Valeanu valen.valentin Data 9 martie 2020 09:05:41
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>
#include <map>
#include <vector>
#include <algorithm>

#define SZ(x) ((int)(x.size()))
#define pb push_back
#define nmax 100010

using namespace std;

int n, n_size;
int a[nmax], dp[nmax], aib[nmax];
vector <int> p;

map <int, int> mp;

inline int lsb(int x) { return x & (-x); }

void update(int pos, int val)
{
	for (int i = pos; i <= n_size; i += lsb(i))
		aib[i] += val;
}

int query(int pos)
{
	int val = 0;
	
	for (int i = pos; i >= 1; i -= lsb(i)) val += aib[i];
	
	return val;
}

int main()
{
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	
	scanf("%d", &n);
	
	for (int i = 1; i <= n; i++) {
		
		scanf("%d", &a[i]); p.pb(a[i]);
	}
	
	sort(p.begin(), p.end());
	
	n_size = 0;
	
	for (int i = 0; i < SZ(p); i++)
		if (mp.find(p[i]) == mp.end()) mp[p[i]] = ++n_size;
	
	for (int i = 1; i <= n; i++) {
		
		int idx = mp[a[i]];
		
		dp[i] = query(idx - 1);
		
		update(idx, 1);
	}
	
	int best = 0;
	
	for (int i = 1; i <= n; i++) best = max(best, dp[i]);
	
	printf("%d", best);
	
	return 0;
}