Cod sursa(job #1020173)

Utilizator dumitrualexAlex Dumitru dumitrualex Data 1 noiembrie 2013 19:20:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <algorithm>
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define inf ~(1 << 31)
#define nmax 100000+5
using namespace std;

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

int a[nmax];
int secv[nmax];
int poz[nmax];
int n;

void citire()
{
    fin >> n;
    FOR(i, 1, n)
        fin >> a[i];
}

void inserare_binara(int i)
{
    int st = 1, dr = *secv;
    int mijl;
    int x = a[i];
    while (st <= dr)
    {
        mijl = (st + dr) / 2;
        if (x < secv[mijl])
            dr = mijl-1;
        else if (x > secv[mijl])
            st = mijl+1;
        else
        {
            st = mijl;
            break;
        }
    }
    secv[st] = x;
    *secv = max(*secv, st);
    poz[i] = st;
}
void rezolvare()
{
    secv[++secv[0]] = a[1];
    poz[1] = 1;

    FOR(i, 2, n)
        inserare_binara(i);
}

void afisare_rec(int indx, int lg)
{
    while (indx >= 1 && poz[indx] != lg) indx--;
    if (indx)
    {
        afisare_rec(indx-1, lg-1);
        fout << a[indx] << ' ';
    }
}
void afisare()
{
    fout << *secv << '\n';
    afisare_rec(n, *secv);
}
int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}