Cod sursa(job #1149739)

Utilizator bullseYeIacob Sergiu bullseYe Data 22 martie 2014 11:05:48
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#define DMAX 100010
using namespace std;

int nr[DMAX], next[DMAX], poz[DMAX];
int n, lgpoz;

void citire(), rez(), afisare();
int binar(int);

int main()
{
    citire();
    rez();
    afisare();
    return 0;
}

void citire()
{
    ifstream fin ("scmax.in");
    fin>>n;
    for (int i=1; i<=n; ++i)
        fin>>nr[i];
    fin.close();
    return;
}

void rez()
{
    int i, p, val;
    for (i=n; i>0; --i)
    {
        val=nr[i];//incerc sa construiesc un LIS cu val
        p=binar(val);
        next[i]=next[i+1];
        if (!poz[p])
            {
                next[i]=poz[p-1];
                ++lgpoz;
            }
        poz[p]=i;
        /*if (nr[poz[p]]<=val)
            poz[p]=i;
            else
            {
            poz[p+1]=i;
            if (p+1>lgpoz)
                lgpoz=p+1;
            next[i]=poz[p];
            }*/
    }
    return;
}

void afisare()
{
    //reconstruiesc solutia
    int i, val;
    ofstream fout("scmax.out");
    fout<<lgpoz<<"\n";
    fout<<nr[poz[lgpoz]]<<" ";
    val=poz[lgpoz];
    for (i=2; i<=lgpoz; ++i)
        {
            fout<<nr[next[val]]<<" ";
            val=next[val];
        }
    fout.close();
    return;
}

int binar (int val)
{
    int st, dr, mij;
    st=0; dr=lgpoz+1;
    while (dr-st>1)
    {
        mij=(st+dr)/2;
        if (nr[poz[mij]]<=val)
            dr=mij;
            else
            st=mij;
    }
    return dr;
}