Cod sursa(job #1150223)

Utilizator cameleonGeorgescu Dan cameleon Data 22 martie 2014 18:10:52
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include<algorithm>
using namespace std;
#define Nmax 100003
int x[Nmax], y[Nmax], aib[Nmax], L[Nmax], ante[Nmax],n, poz[Nmax];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void update(int p, int v){
int lsb;
    while(p<=n){
        if(L[p]> L[aib[v]])
           aib[v] = p;
        lsb = p&(-p);
        p+=lsb;
    }
}
int query(int p){
    int max = 0,lsb;
    while(p>0){
        if(L[max]<L[aib[p]])
            max = aib[p];
        lsb = p&(-p);
        p-=lsb;
    }
    return max;
}
void afis(int i){
if(i!=0)
    {
        afis(ante[i]);
        fout<<y[poz[i]]<<" ";
    }
}

int main()
{
    fin>>n;
    for(int i = 1;i <= n;i++){
        fin>>x[i];
        y[i]=x[i];
    }
    sort(y+1,y+n+1);
    int k=1, best =0;
    for(int i = 2 ; i <= n ; i++){
        if(y[k] != y[i])
            y[++k] = y[i];
    }
    for(int i = 1 ; i <= n ; i++)
        poz[i] = lower_bound(y+1, y+n+1, x[i]) - y;

    for(int i = 1 ; i <= n ; i++){
        ante[i] = query(poz[i]-1);
        L[i] = L[ante[i]] + 1;
        if(L[i] > L[best]) best = i;
        update( i, poz[i]);
    }
    fout<<L[best]<<'\n';
        afis(best);


    return 0;
}