Cod sursa(job #2486065)

Utilizator mascoVlad Facas masco Data 2 noiembrie 2019 11:47:20
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <iostream>
#define N 100010

using namespace std;

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

int n, maxi, v[N], poz[N], l[N], sol[N];

int cautare(int val)
{
    int st=1, dr=maxi;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(v[poz[mij]] < val)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    return st;
}

int main()
{
    fin >> n;
    for(int i=1; i<=n; i++)
    {
        fin >> v[i];
    }
    l[1] = poz[1] = maxi = 1;
    for(int i=2; i<=n; i++)
    {
        if(v[i] > v[poz[maxi]])
        {
            poz[++maxi] = i;
            l[i] = maxi;
        }
        else
        {
            int p = cautare(v[i]);
            l[i] = p;
            poz[p] = i;
        }
    }
    fout << maxi << '\n';
    int maxi1 = maxi;
    for(int i=n; i>=1; i--)
    {
        if(l[i] == maxi)
            sol[maxi] = v[i], maxi--;
    }
    for(int i=1; i<=maxi1; i++)
    {
        fout << sol[i] <<" ";
    }
    fout << '\n';
    return 0;
}