Cod sursa(job #2833104)

Utilizator RaresRacsanRares Racsan RaresRacsan Data 14 ianuarie 2022 18:59:35
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin ("sclm.in");
ofstream fout ("sclm.out");
int n, x, i, A[100001], P[100001], k, D[100001];

int cautareBinara (int k, int n)
{
    int st = 0, dr = k - 1;
    while(st <= dr)
    {
        int m = (st + dr) / 2;
        if(D[m] == n)
            return m;
        else if(D[m] < n)
            st = m + 1;
        else
            dr = m - 1;
    }
    return st;
}

int main()
{
    fin >> n;
    int poz = 0;
    fin >> A[0];
    D[0] = A[0];
    k = 1;
    P[0] = 0;
    for(i = 1; i < n; i++)
    {
        fin >> A[i];
        if(A[i] > D[k-1])
        {
            D[k] = A[i];
            P[i] = k;
            k++;
            poz = i;
        }
        else
        {
            int p = cautareBinara(k, A[i]);
            D[p] = A[i];
            P[i] = p;
        }
    }
    fout << k << '\n';
    k--;
    int j = 0;
    for(i = poz; k >= 0; i--)
    {
        if(P[i] == k)
        {
            D[j++] = i;
            k--;
        }
    }
    for(i = j - 1; i >= 0; i--)
        fout << A[D[i]] << ' ';
    return 0;
}