Cod sursa(job #3321463)

Utilizator Andreea1501013Andreea Andreea1501013 Data 9 noiembrie 2025 16:19:32
Problema Subsir crescator maximal Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
vector<int> scm(100005); /// scm[i]= pozitia in sirul initial a elemetului minim cu care se poate termina un subsir strict crescator de i elemente
int v[100005],sol[100005];
unordered_map<int,int> last; ///retine elementul anterior in sir, pentru a se putea construi
int main()
{
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    int N,nr,cnt=1;
    cin>>N;
    for(int i=1; i<=N; i++)
    {
        cin>>nr;
        v[i]=nr;
        if(i==1)
        {
            scm[1]=nr;
            continue;
        }
        //cout<<scm.back()<<' ';
        if(nr > scm.back())
        {
            last[nr]=scm.back();
            scm.push_back(nr);
            cnt++;
        }
        else
        {
            /// caut primul nr mai mare sau egal cu nr si il inlocuiesc
            int poz = lower_bound(scm.begin()+1,scm.end(),nr) -scm.begin();
            scm[poz]=nr;
           // cout<<scm[1]<<' ';
            last[nr]=scm[poz-1];
        }

    }
    cout<<cnt-1<<'\n';
    nr=scm.back();
    int c=cnt;
    while(c--)
    {
        sol[c]=nr;
        nr=last[nr];
    }
    for(int i=1;i<cnt;i++)
    {
        cout<<sol[i]<<' ';
    }
    return 0;
}