Cod sursa(job #2870116)

Utilizator RTG123Razvan Diaconescu RTG123 Data 12 martie 2022 09:43:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAXN 100001
#define zeros(x) ((x ^ (x-1)) & x)
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,v[MAXN],dp[MAXN],afis[MAXN],maxl,aib[4*MAXN],besti[MAXN],from[MAXN],l[MAXN],r[MAXN],h=1;
void update (int x,int ind)
{
    for (x; x<=n; x+=zeros(x))
    {
        if (besti[ind]>besti[aib[x]])
        {
            aib[x]=ind;
        }
    }
}
int query (int x)
{
    int max1=0;
    for (x; x>0; x-=zeros(x))
    {
        if (besti[max1]<besti[aib[x]])
        {
            max1=aib[x];
        }
    }
    return max1;
}
int main()
{
    f>>n;
    for (int i=1; i<=n; i++)
    {
        f>>v[i];
        r[i]=l[i]=v[i];
        //update(1,1,n,i);
    }
    sort(l+1,l+1+n);
    for (int i=2; i<=n; i++)
    {
        if (l[i]!=l[h])
        {
            ++h;
            l[h]=l[i];
        }
    }
    for (int i=1; i<=n; i++)
    {
        v[i]=lower_bound(l+1,l+1+h,v[i])-l;
        //cout<<v[i]<<' ';
    }
    dp[1]=1;
    for (int i=1; i<=n; i++)
    {
        int max1=0;
        from[i]=query(v[i]-1);
        besti[i]=besti[from[i]]+1;
        update(v[i],i);
        /*for (int j=i-1; j>=1; j--)
        {
            if (v[i]>v[j])
            max1=max(max1,dp[j]);
        }*/
        //cout<<val<<'\n';
        //dp[i]=val+1;
        //maxl=max(maxl,besti[i]);
        if (besti[maxl]<besti[i])
            maxl=i;
    }
    g<<besti[maxl]<<'\n';
    int l=besti[maxl];
    for (int i=maxl; i; i=from[i])
    {
        afis[l]=r[i];
        l--;
    }
    for (int i=1; i<=besti[maxl]; i++)
        g<<afis[i]<<' ';
    /*for (int i=n; i>=1; i--)
    {
        if (dp[i]==l)
        {
            afis[l]=v[i];
            l--;
        }
    }
    for (int i=1; i<=maxl; i++)
        g<<afis[i]<<' ';*/
    return 0;
}