Cod sursa(job #536742)

Utilizator AndruLerghievici Andra Gabriela Andru Data 19 februarie 2011 10:39:51
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio> 
#include <cstdlib> 
#define mare 0x3fffffff 
using namespace std; 
typedef int vector[100001]; 
 
vector v, p, q; 
int *s, n, nq; 
 
void citire() 
{   freopen ("scmax.in", "r", stdin); freopen ("scmax.out", "w", stdout); 
    scanf ("%d", &n); for (int i = 1; i <= n; ++i) scanf ("%d", &v[i]); 
}  
 int ins_bin (int k, int x, int y) 
{   int mij = (x + y) / 2; 
    if (x == y) 
	{
			if (y > nq) q[++nq + 1] = mare; 
			q[x] = k; 
			return x;
	}
	else 
		if (k <= q[mij]) return ins_bin (k, x, mij); 
			else return ins_bin (k, mij+1, y); 
} 

void creare_pq() 
{   nq = 0; 
    q[1] = mare; 
    for (int i = 1; i <= n; ++i) 
        p[i] = ins_bin (v[i], 1, nq+1); 
} 

void caut_sol() 
{   int i, k = n; 
    s = (int *) calloc (nq + 1, sizeof(int)); 
    for (i = nq; i; --i) 
	{
		while (p[k] != i) --k; 
		*(s + i) = v[k]; 
	}  
} 
void scriu_sol() 
{   printf ("%d\n", nq); 
	for (int i = 1; i <= nq; ++i) 
       printf ("%d ", *(s+i)); 
	printf ("\n"); 
} 

int main() 
{   citire(); 
    creare_pq(); 
	caut_sol(); 
    scriu_sol(); 
    return 0; 
}