Cod sursa(job #553169)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 13 martie 2011 18:15:52
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#include <algorithm>
#define DIM2 8192
#define maxn 100050
#define mid ((st + dr) >> 1)
#define fs (mid << 1)
#define fd ((mid<<1)+1)

using namespace std;

int D[maxn], lst[maxn], h, res, ind, A[maxn], B[maxn], up[maxn], k, N, arb[4 * maxn], sol[4 * maxn];
char vec[DIM2];
int poz;
void cit(int &x)   
{   
  x=0;   
  while(vec[poz]<'0' || vec[poz]>'9')   
       if(++poz==DIM2) fread(vec,1,DIM2,stdin),poz=0;   
  
    while(vec[poz]>='0' && vec[poz]<='9')   
    {   
        x=x*10+vec[poz]-'0';   
        if(++poz==DIM2) fread(vec, 1, DIM2, stdin),poz=0;   
    }  
}   
void update (int nod, int st, int dr, int val, int nr, int poz)
{
	if (st == dr) {
		if (arb[nod] < nr) {
			arb[nod] = nr;
			sol[nod] = poz;
		}	
		return ;
	}
	
	if (val <= mid)
		update (fs, st, mid, val, nr, poz);
	if (val > mid)
		update (fd, mid + 1, dr, val, nr, poz);
	if (arb[fs] > arb[fd]) sol[nod] = sol[fs];
	else sol[nod] = sol[fd];
	
	arb[nod] = max (arb[fs], arb[fd]);
}
void query (int nod, int st, int dr, int b)
{
	if (b >= dr || st == dr) {
		if (res < arb[nod]) {
			res = arb[nod];
			ind = sol[nod];
		}
		return ;
	}
	query (fs, st, mid, b);
	if (b > mid) query (fd, mid + 1, dr, b);
}
int main ()
{

	freopen ("scmax.in", "r", stdin);
	freopen ("scmax.out", "w", stdout);

	cit (N);
	
	int i, ord;

	for (i = 1; i <= N; i++)
	{
		cit (A[i]);
		B[i] = A[i];
	}
	sort (A + 1, A + N + 1);
	k = unique (A + 1, A + N + 1) - A;
	k -= 1;

	for (i = 1; i <= N; i++) {

		ord = lower_bound (A + 1, A + k + 1, B[i]) - A;
		res = 0;
		ind = 0;
//		printf ("%d\n", ord);
		if (ord - 1)
			query (1, 1, k, ord - 1);
		
		D[i] = res + 1;
		up[i] = ind;
		
		update (1, 1, k, ord, D[i], i);
	}
	int mx, pz;
	mx = 0;
	
	for (i = 1; i <= N; i++)
		if (mx < D[i])
			mx = D[i], pz = i;

	printf ("%d\n", mx);	
	
	for (i = pz; i; i = up[i]) 
		lst[++h] = B[i];
	
	for (; h >= 2; h--)
		printf ("%d ", lst[h]);
	printf ("%d\n", lst[1]);
	return 0;
}