Cod sursa(job #1281824)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 3 decembrie 2014 19:31:59
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 200023
FILE *fin, *fout;
long long int max(long long int a, long long int b)
{
	return (a>b)?a:b;
}
struct num
{
	long long int val;
	long long int poz;
} *v;
long long int n, *v1, arb[NMAX];
bool cmp(num a, num b)
{
	return (a.val < b.val);
}
long long int interogare(long long int st, long long int dr, long long int st1, long long int dr1, long long int nod)
{
	if(st == st1 && dr == dr1) return arb[nod];
	long long int mij = (st + dr)/2;
	if(st1 > mij) return interogare(mij+1, dr, st1, dr1, 2*nod+1);
	if(dr1 <= mij) return interogare(st, mij, st1, dr1, 2*nod);
	return max(interogare(mij+1, dr, mij+1, dr1, 2*nod+1), interogare(st, mij, st1, mij, 2*nod));
}
void pun(long long int st, long long int dr, long long int val, long long int nod)
{
	if(st == dr)
	{
		if(st == 1) arb[nod] = 1;
		else arb[nod] = interogare(1, n, 1, st-1, 1) + 1;
		return;
	}
	long long int mij = (st+dr)/2;
	if(val > mij) pun(mij+1, dr, val, 2*nod+1);
	if(val <= mij) pun(st, mij, val, 2*nod);
	arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}
int main()
{
	fin = fopen("scmax.in", "r");
	fout = fopen("scmax.out", "w");
	fscanf(fin, "%lld", &n);
	v1 = new long long int[n+23];
	v = new num[n+23];
	for(long long int i =1; i<= n; i++)
	{
		fscanf(fin, "%lld", &v[i].val);
		v[i].poz = i;
	}
	std::sort(v+1, v+n+1, cmp);
	long long int temp = 0;
	for(long long int i =1; i<= n; i++)
	{
		if(i>1 && v[i].val == v[i-1].val) temp ++;
		v1[v[i].poz]  = i - temp;
	}
	for(long long int i = 1; i<= n; i++)
	{
		pun(1, n, v1[i], 1);
	}
	fprintf(fout, "%lld\n", arb[1]);
	fclose(fin);
	fclose(fout);
	return 0;
}