Cod sursa(job #2949192)

Utilizator maria_neagoieMaria Neagoie maria_neagoie Data 30 noiembrie 2022 09:51:01
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
using namespace std;
const int NMAX=100005;
int v[NMAX],lis=1,ant[NMAX],temp[NMAX],poz[NMAX],rez[NMAX];
int caut_bin(int st,int dr,int x)
{
    int med,ans;
    while(st<=dr)
    {
        med=(st+dr)/2;
        if(temp[med]>=x)
        {
            ans=med;
            dr=med-1;
        }
        else
            st=med+1;
    }
    return ans;
}
void LIS(int v[],int n)
{
    int i,ind;
    temp[1]=v[1];
    poz[1]=1;
    ant[1]=0;
    for(i=2;i<=n;i++)
    {
        if(v[i]>temp[lis])
        {
            temp[++lis]=v[i];
            poz[lis]=i;
            ant[i]=poz[lis-1];
        }
        else
        {
            ind=caut_bin(1,lis,v[i]);
            temp[ind]=v[i];
            poz[ind]=i;
            ant[i]=poz[ind-1];
        }
    }
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i,ppoz;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    LIS(v,n);
    printf("%d",lis);
    printf("\n");
    ppoz=poz[lis];
    while(ppoz)
    {
        rez[++rez[0]]=v[ppoz];
        ppoz=ant[ppoz];
    }
    for(i=lis;i>=1;i--)
        printf("%d ",rez[i]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}