Cod sursa(job #2529126)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 22 ianuarie 2020 23:04:55
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
using namespace std;

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

int a[100001], s[100001], p[100001], k = 1;
int stv[100001];

int cb(int ind)
{
    //caut binar val astfel incat val >= s[i], i minim
    int st = 1, dr = k, mij;
    while (st <= dr)
    {
        mij = (st+dr)>>1;
        if (a[s[mij]] >= a[ind])
            dr = mij - 1;
        else
            st = mij + 1;
    }
    return st;
}

int main()
{
    int i, n, poz, j;
    fin >> n;
    for (i = 1; i<=n; i++)
        fin >> a[i];
    p[1] = -1;
    s[1] = 1;
    for (i = 2; i<=n; i++)
    {
        if (a[i] > a[s[k]])
        {
            p[i] = s[k];
            k++;
            s[k] = i;
        }
        else
        {
            poz = cb(i);
            p[i] = s[poz-1];
            s[poz] = i;
        }
    }
    fout << k << '\n';
    for (i = s[k], j = 1; j<=k; i=p[i], j++)
        stv[j] = a[i];
    for (i = k; i>=1; i--)
        fout << stv[i] << ' ';
    return 0;
}