Cod sursa(job #2841494)

Utilizator CelestinNegraru Celestin Celestin Data 29 ianuarie 2022 19:55:17
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#define maxi 100005
using namespace std;
ifstream f("scmax.in",ios::in);
ofstream g("scmax.out",ios::out);
int dp[maxi],v[maxi],poz[maxi],n,sclm[maxi],r;
void read()
{
    f>>n;
    for(int i=1;i<=n;i++)
        f>>*(v+i);
    f.close();
    return;
}
void dinamica()
{
    int k=0;
    dp[++k]=v[1];
    poz[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(v[i]>dp[k])
        {
            dp[++k]=v[i];
            poz[i]=k;
        }
        else if(v[i]==dp[k])
        {
            poz[i]=k;
        }
        else{
            int st=1,dr=k,p=k+1;
            while(st<=dr)
            {
                int mid=(st+dr)>>1;
                if(dp[mid]>v[i])
                {
                    p=mid;
                    dr=mid-1;
                }
                else st=mid+1;
            }
            dp[p]=v[i];
            poz[i]=p;
        }
    }
    int j=n;
    for(int i=k;i>=1;i--)
    {
        while(poz[j]!=i)
            j--;
        sclm[++r]=v[j];
    }
    g<<k<<'\n';
    for(int i=r;i>=1;i--)
        g<<sclm[i]<<" ";
    g.close();
    return;
}
int main()
{
    read();
    dinamica();
    return 0;
}