Cod sursa(job #2844191)

Utilizator alexddAlexandru Dima alexdd Data 3 februarie 2022 22:01:26
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int sol[100005],sol2[100005],n,prov[100005],v[100005];
int cautare_binara(int x,int poz)
{
    int st,dr,mij;
    st=0;
    dr=poz-1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(sol[mij]<x && sol[mij+1]>=x)
        {
            return mij;
        }
        else if(sol[mij]<x)
            st=mij+1;
        else
            dr=mij-1;
    }
    return -1;
}
void initializeaza()
{
    for(int i=1;i<=n+1;i++)
    {
        sol2[i]=-1;
        prov[i]=-1;
        sol[i]=1e5+1;
    }
    prov[0]=-1;
    sol[0]=0;
}
void recurs_afis(int x)
{
    if(x==-1 || x==0)
        return;
    recurs_afis(prov[x]);
    fout<<v[x]<<" ";
}
int main()
{
    int a,b;
    fin>>n;
    initializeaza();
    for(int i=1;i<=n;i++)
    {
        fin>>a;
        v[i]=a;
        b=cautare_binara(a,i);
        if(a<sol[b+1])
        {
            prov[i]=sol2[b];
            sol[b+1]=a;
            sol2[b+1]=i;
        }
    }
    for(int i=n;i>0;i--)
    {
        if(sol[i]!=(1e5+1))
        {
            fout<<i<<"\n";
            recurs_afis(sol2[i]);
            return 0;
        }
    }
}
///sol[i]=elementul minim cu care se poate termina un subsir crescator de lungime i