Cod sursa(job #3000444)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 12 martie 2023 14:28:47
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 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;

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

int main()
{
    fin >> n;
    for(int i = 1 ; i <= n ; ++i)
        fin >> v[i];
    dp[++k] = v[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;
                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;
            }
    fout << k << '\n';
    Reconstruire(k , n);
}