Cod sursa(job #536739)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 februarie 2011 10:35:24
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
# include <cstdio>
# include <cstdlib>
# define  mare  2000000000
  using namespace std;
    typedef int vector[100001];
	vector v, p, q;
	int *s, n, nq;
	void citire (){
		freopen ("scmax.in", "rt", stdin);
		scanf ("%d", &n);
		for (int i = 1; i <= n; ++i)
			scanf ("%d", &v[i]);
	}
	int cb (int in, int sf, int find){
		int ret = nq + 1;
		while (in <= sf){
			int m = (in + sf) / 2;
			if (q[m] >= find){
				ret = m; 
				sf = m - 1;
			}
			else
				in = m + 1;
		}
		q[ret] = find;
		return ret;
	}
	//UNION
	void crpq (){
        q[1] = mare;
		nq = 1;
		for (int i = 1; i <= n; ++i){
			p[i] = cb (1, nq + 1, v[i]);
			nq = (nq > p[i] ? nq : p[i]);
			q[nq + 1] = mare;
		}
	}
	void csol (){
		int i, k = n;
		s = (int * ) calloc (nq + 1, sizeof (int) );
		for (i = nq; i > 0; --i){
			while (p[k] != i) --k;
			* (s + i) = v[k];
	    }
	}
	void wsol (){
		freopen ("scmax.out", "wt", stdout);
		printf ("%d\n", nq);
		for (int i = 1; i <= nq; ++i)
			printf ("%d ", * (s + i) );
	}
    int main (){
		citire ();
		crpq ();
		csol ();
		wsol ();
		return 0;
	}