Cod sursa(job #2171699)

Utilizator calinfloreaCalin Florea calinflorea Data 15 martie 2018 13:14:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define NMax 100006
using namespace std;

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

int a[NMax], lis[NMax], poz[NMax], drum[NMax];
int n, K;

inline void Citire()
{
    int i;

    fin >> n;

    for(i = 1; i <= n; i++)
        fin >> a[i];
}

int CautBin(int x)
{
    int st = 1, dr = K, mid, sol = K;

    while(st <= dr)
    {
        mid = (st + dr) / 2;

        if(x <= lis[mid])
        {
            sol = mid;
            dr = mid - 1;
        }
        else
            st = mid + 1;
    }

    return sol;
}
inline void LIS()
{
    int i, x, p;

    lis[1] = a[1];
    K = 1;
    poz[1] = 1;

    for(i = 2; i <= n; i++)
    {
        x = a[i];

        if(x > lis[K])
        {
            lis[++K] = x;
            poz[i] = K;
        }

        else
            if(lis[1] >= x)
            {
                lis[1] = x;
                poz[i] = 1;
            }
        else
        {
            p = CautBin(x);
            lis[p] = x;
            poz[i] = p;
        }
    }
}

inline void Afisare()
{
    int i, P = K;

    fout << K << "\n";

    for(i = n; i >= 1 && P != 0; i--)
        if(poz[i] == P)
        {
            drum[P] = a[i];
            P--;
        }

    for(i = 1; i <= K; i++)
        fout << drum[i] << " ";
    fout << "\n";
}
int main()
{
    Citire();
    LIS();
    Afisare();
    return 0;
}