Cod sursa(job #2037461)

Utilizator buzandanBuzan Dan Alexandru buzandan Data 12 octombrie 2017 11:39:52
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <iostream>
using namespace std;

int a[100001],v[100001],sol[100001],p[100001];
int n,Lmax;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

void Scmax();
int Cautare_Binara(int x);
void Scrie_Sir();

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> a[i];
   // cout << Cautare_Binara(a[3]);
    Scmax();
    Scrie_Sir();

}

void Scmax()
{
    for (int i = 1; i <= n; i++)
    {
        int poz = Cautare_Binara(a[i]);
        v[poz] = a[i];
        p[i] = poz;
        if (poz > Lmax)
            Lmax = poz;

    }
}

void Scrie_Sir()
{
    int k = Lmax,j = 1;
    for (int i = n; i >= 1; i--)
        if(p[i] == k)
        {
            sol[j++] = a[i];
            k--;
        }
    fout << Lmax << '\n';
    for (int i = j - 1; i >= 1; --i)
        fout << sol[i] << ' ';
}

int Cautare_Binara(int x)
{

    if(x > v[Lmax])
        return Lmax + 1;
    int l = 1,r = Lmax,m,poz = 1;
    while(l <= r)
    {
        m = (l + r) / 2;
        if(v[m] >= x)
        {
            poz = m;
            r = m - 1;
        }
        else
            l = m + 1;
    }
    //v[poz] = x;
    return poz;
}