Cod sursa(job #2795552)

Utilizator rARES_4Popa Rares rARES_4 Data 6 noiembrie 2021 16:08:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb

#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
int n,x,l_sir = 1;
int v[100001],v_final[100001],poz_in_v_final[100001];
int cb(int x)
{
    int st = 1,dr = l_sir,mij,ans = l_sir+1;
    while(st<=dr)
    {
        mij = (st+dr)/2;
        if(v_final[mij]>=x)
        {
            ans = mij;
            dr = mij-1;
        }
        else if (v_final[mij]<x)
            st = mij+1;
    }
    return ans;
}
void afisare(int cnt,int poz)
{
    if(cnt==0)
        return;
    for(int i = poz;i>=0;i--)
    {
        if(poz_in_v_final[i]==cnt)
            {
                afisare(cnt-1,i-1);
                g << v[i]<< " ";
                return;
            }
    }
}
/* trebuie sa afisam recursiv din vectorul poz_in_v_final si nu pur si simplu v_final pentru a afisa un subsir
de ex daca avem sirul 13 14 1 sirul din v_final va fi 1 14 ceea ce este greesit dar in poz_in_v_final va fi sirul 1 2 1
iar afisand recursiv afisam 13 14*/
int main()
{
    f >> n;
    f >> v[1];
    v_final[1] = v[1];
    poz_in_v_final[1] = 1;
    for(int i = 2;i<=n;i++)
    {
        f >> v[i];
        int poz = cb(v[i]);
        v_final[poz] = v[i];
        poz_in_v_final[i] = poz;
        l_sir = max(l_sir,poz);
    }
    g <<l_sir<<'\n';
    afisare(l_sir,n);
}