Cod sursa(job #633703)

Utilizator cnt_tstcont teste cnt_tst Data 14 noiembrie 2011 16:24:43
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#include <algorithm>
#define DIM 100001

using namespace std;

int V[DIM], W[DIM], A[DIM], i, p, N, Maxim, Max, K;

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

int cauta(int x) {
	int p = 1, u = K, m;
	while (p<=u) {
		m = (p+u) / 2;
		if (W[m] == x)
			return m;
		if (W[m] < x)
			p = m+1;
		else
			u = m-1;
	}
}

int query (int p) {
	int maxim = 0;
	for (;p;p-=lsb(p)) {
		if (maxim < A[p])
			maxim = A[p];
	}
	return maxim;
}

void update(int p, int v) {
	for (;p<=K;p+=lsb(p))
		if (A[p] < v)
			A[p] = v;
}


int main() {
	FILE *f = fopen("scmax.in","r");
	FILE *g = fopen("scmax.out","w");
	fscanf(f,"%d",&N);
	for (i=1;i<=N;i++) {
		fscanf(f,"%d",&V[i]);
		W[i] = V[i];
	}
	fclose(f);
	sort(W+1, W+N+1);
	K = 1;
	for (i=2;i<=N;i++)
		if (W[i] != W[K])
			W[++K] = W[i];
	
//	A[i] = maximul din L pentru valori ce corespund elementelor din V din intervalul [  V[i-2^k + ] V[i]   ]
	
	for (i=1;i<=N;i++) {
		p = cauta(V[i]);
		int Max = query(p-1);
		if (1+Max > Maxim)
			Maxim = 1 + Max;
		update(p, 1+Max);
	}
	
	fprintf(g,"%d\n",Maxim);
	
	return 0;
}