Cod sursa(job #3289256)

Utilizator Lex._.Lexi Guiman Lex._. Data 26 martie 2025 12:03:31
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;

int a[100001]; //vectorul citit
vector<int> LIS; //salvam in LIS pozitiile elementelor sirului crescator

int cautare_binara(int val, int dr)
{
    int poz=0, st=0;
    while(st<=dr)
    {
        int mij=st+(dr-st)/2;
        if(val<=a[LIS[mij]])
        {
            poz=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return poz;
}

int main()
{
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    int n;
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> a[i]; //citim vectorul
    LIS.reserve(n);
    for(int i=0; i<n; i++)
    {
        if(LIS.empty())
            LIS.push_back(i);
        else
        {
            if(a[i]>a[LIS.back()])
                LIS.push_back(i);
            else
            {
                int pozitie=cautare_binara(a[i], LIS.size()-1);
                LIS[pozitie]=i;
            }
        }
    }
    cout << LIS.size() << "\n"; //afisam lungimea subsirului

    //calculam subsirul care este ordonat strict crescator si care are lungimea maxima
    int pozitie=LIS.back(); //pozitia in vectorul a
    a[n]=2000000001; LIS.push_back(n); //adaugam la finalul vectorului un numar care stim sigur ca este mai mare ca toate cele din vector
    for(int i=LIS.size()-2; i>=0; i--)
    {
        while(pozitie>=0)
        {
            if(a[pozitie]>=a[LIS[i]] && a[pozitie]<a[LIS[i+1]])
                break;
            pozitie--;
        }
        LIS[i]=pozitie;
        pozitie--;
    }
    LIS.pop_back(); //eliminam ultimul element (cel adaugat mai devreme la final pentru a calcula mai usor pozitiile)
    for(auto& element : LIS) //afisam elementele subsirului crescator
        cout << a[element] << " ";

    return 0;
}