Cod sursa(job #2481389)

Utilizator Alin_StanciuStanciu Alin Alin_Stanciu Data 26 octombrie 2019 20:22:48
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct Sir
{
    // un sir este format din ultimul element si sirul fara ultimul element
    int a;
    Sir* tata;

    Sir(const int& a, Sir* const tata)
    {
        this->a = a;
        this->tata = tata;
    }
};

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

int n, ma = 0;
Sir* A[100001];

int CB(int);
void Afisare();

int main()
{
    fin >> n;
    for (int i = 1; i <= n; ++i)
    {
        int a;
        fin >> a;
        int p = CB(a);
        if (p == ma + 1)
            ++ma;
        A[p] = new Sir(a, A[p - 1]);
    }
    Afisare();

    return 0;
}

int CB(int a) // ret poz primului el >= a, sau ma+1 daca A[ma]<a
{
    int st = 1, dr = ma + 1;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        if ((A[mij] == nullptr || A[mij]->a >= a) && (A[mij - 1] == nullptr || A[mij - 1]->a < a))
            return mij;
        else if (A[mij - 1] != nullptr && A[mij - 1]->a >= a)
            dr = mij - 1;
        else st = mij + 1; // if (A[mij]->a < a)
    }
}

void Afisare()
{
    fout << ma << '\n';
    vector<int> V;
    Sir* p = A[ma];
    while (p != nullptr)
    {
        V.push_back(p->a);
        p = p->tata;
    }
    for (int i = V.size() - 1; i >= 0; --i)
        fout << V[i] << " ";
}