Cod sursa(job #1246291)

Utilizator yololy97Olaru Bogdan-Ioan yololy97 Data 20 octombrie 2014 21:41:02
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <algorithm>
#define N 100001
using namespace std;
int dp[N], v[N], n, H[N], maxim;
struct nod{
	int val, ind;
}a[N];
struct cmp{
	bool operator()(const nod &a, const nod &b) const{
		if(a.val < b.val)
			return true;
		return false;
	}
};
void update(int node, int L, int R, int pos, int val){
	int M = (L + R) / 2;
	if(L == R)
		H[node] = val;
	else{
		if(pos <= M)
			update(node * 2, L, M, pos, val);
		else
			update(node * 2 + 1, M + 1, R, pos, val);
		H[node] = max(H[node * 2], H[node * 2 + 1]);
	}
}
int query(int node, int L, int R, int ql, int qr){
	if(ql <= L && qr >= R)
		return H[node];
	int M = (L + R) / 2, maxi = 0;
	if(ql <= M)
		maxi = max(query(node * 2, L, M, ql, qr), maxi);
	if(qr > M)
		maxi = max(query(node * 2 + 1, M + 1, R, ql, qr), maxi);
	return maxi;
}
int main(){
    freopen("scmax.out", "w", stdout);
	freopen("scmax.in", "r", stdin);
    scanf("%d ",&n);
    for(int i = 1; i <= n; ++i)
        scanf("%d ", &a[i].val),
		a[i].ind = i;
	sort(a + 1, a + n + 1, cmp());
	int j = 0;
	for(int i = 1; i <= n; ++i)
		if(a[i].val != a[i - 1].val)
			v[a[i].ind] = ++j;
		else
			v[a[i].ind] = j;
	for(int i = 1; i <= n; ++i){
		if(v[i] > 1)
			dp[i] = 1 + query(1, 1, n, 1, v[i] - 1);
		else
			dp[i] = 1;
		update(1, 1, n, v[i], dp[i]);
		if(dp[i] > maxim)
			maxim = dp[i];
	}
	printf("%d ", maxim);
}