Cod sursa(job #2784437)

Utilizator ana_madalina_18Radu Ana Madalina ana_madalina_18 Data 16 octombrie 2021 14:47:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>

using namespace std;
int v[100005], dp[100005], pozitii[100005];
int rasp[100005];
int caut_binar(int st, int dr, int x)
{
    int raspuns=0;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(v[pozitii[mij]]>=x)
        {
            dr=mij-1;
        }
        else
        {
            raspuns=mij;
            st=mij+1;
        }
    }
    return raspuns;
}
int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    int n;
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    int j=0;
    for(int i=1;i<=n;i++)
    {
       if(v[i]>v[pozitii[j]])
       {
           j++;
           dp[i]=dp[pozitii[j-1]]+1;
           pozitii[j]=i;
           //fout<<"v[i]="<<v[i]<<'\n';
           //fout<<"j="<<j<<'\n';
       }
       else
       {
            int anterior=caut_binar(1,j,v[i]);
            pozitii[anterior+1]=i;
            dp[i]=dp[pozitii[anterior]]+1;
       }
    }
    fout<<j<<'\n';
    int lung_max=j;
    int lung_curenta=lung_max-1;
    rasp[lung_max]=v[pozitii[j]];
    for(int i=pozitii[j]-1;i>=1;i--)
    {
        if(dp[i]==lung_curenta && v[i]<rasp[lung_curenta+1])
        {
            rasp[lung_curenta]=v[i];
            lung_curenta--;
        }
    }
    for(int i=1;i<=lung_max;i++)
        fout<<rasp[i]<<' ';
    return 0;
}