Cod sursa(job #673020)

Utilizator balakraz94abcd efgh balakraz94 Data 3 februarie 2012 18:23:05
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <cstdio>
#include <algorithm>
#define infile "scmax.in"
#define outfile "scmax.out"
#define n_max 100005
using namespace std;

int lst[n_max], v[n_max], a[n_max], prev[n_max], Lg[n_max];

int AI[3*n_max];

int bst;

int N;

 
void update(int nod, int st, int dr, int poz, int x)
{    
    if(st == dr)
    {
        AI[nod] = x;
        return;
    }
    
    int mij = st + (dr-st)/2;
    
    if(poz <= mij)
        update(2*nod, st, mij, poz, x);
    else
        update(2*nod+1, mij+1, dr, poz, x);
    
    if(Lg[AI[2*nod]] > Lg[AI[2*nod+1]])
        AI[nod] = AI[2*nod];
    else
        AI[nod] = AI[2*nod+1];
}



void query(int nod, int st, int dr, int a, int b, int &rez)
{
	if(a > b)
		return;
	
    if(a<=st && dr<=b)
    {
        if(Lg[AI[nod]] > Lg[rez])
            rez = AI[nod];
        return;
    }
    
    int mij = st + (dr - st)/2;
    
    if(a <= mij)
        query(2*nod, st, mij, a, b, rez);
    if(mij < b)
        query(2*nod+1, mij+1, dr, a, b, rez);
}



void citeste()
{
    freopen(infile, "r", stdin);
    
    scanf("%d", &N);
    
    for (int i = 1; i <= N; ++i)
    {
        scanf("%d", &a[i]);
        
        v[i] = lst[i] = a[i];
    }
    
    fclose(stdin);
}



void rezolva()
{
	int i;
    sort(lst+1,lst+N+1);
    
    for (i = 2, lst[0] = 1; i <= N; ++i)
        if (lst[i] != lst[lst[0]])
            lst[++lst[0]] = lst[i];
    
    for (i = 1; i <= N; ++i)
        v[i] = lower_bound(lst+1, lst+lst[0]+1, v[i])-lst;
    
    for(i=1;i<=N;i++)
    {
        query(1, 1, N, 1, v[i]-1, prev[i]);
        
        Lg[i] = Lg[prev[i]] + 1;
        
        update(1, 1, N, v[i], i);
    }
    
    for(i=1, bst=1;i<=N;i++)
        if(Lg[i] > Lg[bst])
            bst = i;
        
    lst[0] = 0;
    for(i = bst; i; i = prev[i])
        lst[++lst[0]] = a[i];

}


void afiseaza()
{
    freopen(outfile, "w", stdout);
    
    printf("%d\n", Lg[bst]);
    
    for(int i=lst[0];i;i--)
        printf("%d ",lst[i]);

    fclose(stdout);
}


int main(void)
{
    citeste();
    rezolva();
    afiseaza();
    
    return 0;
}