Cod sursa(job #1909719)

Utilizator FredyLup Lucia Fredy Data 7 martie 2017 13:44:02
Problema Subsir crescator maximal Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;


ifstream fin("scmax.in");
ofstream fout("scmax.out");

#define lim 10010
int n,ini[lim],dr,v[lim],aib[lim],maxm,act,dad[lim];


int b_s(int val)
{
    int pos=0,mask;
    for(mask=1; mask<=n; mask<<=1);
    for(; mask; mask>>=1)
        if(pos+mask<=n)
            if(aib[pos+mask]<=val)
                pos+=mask;
    return pos;
}


void normalizare()
{
    sort(aib+1,aib+n+1);

    for(int i=1; i<=n; i++)
        v[i]=b_s(ini[i]);
}


void initializare()
{
    for(int i=1; i<=n; i++)
        aib[i]=0;
}


int query(int posini)
{
    int rez=0;

    for(int pos=posini-1; pos; pos-=(pos&(-pos)))
    {
        if(aib[pos]>=rez)
        {
            rez=aib[pos];
            if(v[pos]!=v[posini])
                dad[posini]=pos;
            else
                dad[posini]=dad[pos];
        }
    }

    return rez;
}


void update(int pos, int val)
{
    for(; pos<=n; pos+=(pos&(-pos)))
        aib[pos]=max(aib[pos],val);
}


void drum(int k)
{
    if(dad[k])
    {
        drum(dad[k]);
        fout<<ini[k]<<' ';
    }
    else
        fout<<ini[k]<<' ';
}


int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>ini[i], aib[i]=ini[i];

    normalizare();
    initializare();

    maxm=-1;
    for(int i=1; i<=n; i++)
    {
        act=query(v[i])+1;
        if(act>maxm)
            maxm=act, dr=i;
        update(v[i],act);
    }
    fout<<maxm<<'\n';
    drum(dr);
//    for(int i=1; i<=n; i++)
//        fout<<dad[i]<<' ';
    fin.close();
    fout.close();
    return 0;
}