Cod sursa(job #3000458)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 12 martie 2023 14:41:40
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

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

const int dim = 1e5 + 5;

int v[dim] , dp[dim] , p[dim] , k , n;
vector <int> Sol;

void Reconstruire (int Lg , int poz)
{
    if(Lg >= 1)
        {
            int i = poz;
            for(; p[i] != Lg; --i);
            Reconstruire(Lg - 1 , i);
            fout << dp[p[i]] << " ";
        }
}

int main()
{
    fin >> n;
    for(int i = 1 ; i <= n ; ++i)
        fin >> v[i];
    dp[++k] = v[1];
    p[1] = 1;
    for(int i = 2 ; i <= n ; ++i)
        if(v[i] > dp[k])
            {
                dp[++k] = v[i];
                p[i] = k;
            }
        else if(v[i] <= dp[k])
            {
                int l = 1 , r = k , poz = k + 1;
                while(l <= r)
                    {
                        int mid = (l + r) / 2;
                        if(dp[mid] > v[i])
                            {
                                poz = mid;
                                r = mid - 1;
                            }
                        else
                            l = mid + 1;
                    }
                dp[poz] = v[i];
                p[i] = poz;
            }
    int j = n;
    for(int i = k ; i ; --i)
        {
            while(p[j] != i) --j;
            if(Sol.empty() || Sol[Sol.size() - 1] != v[j])
            Sol.push_back(v[j]);
        }
    fout << Sol.size() << '\n';
    for(int i = Sol.size() - 1 ; i >= 0 ; --i) fout << Sol[i] << " ";
}