Cod sursa(job #3314502)

Utilizator VladStroica1234Vlad Stroica VladStroica1234 Data 10 octombrie 2025 10:52:28
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb

#include <bits/stdc++.h>
using namespace std;
const int Maxm=100005;
int v[Maxm], dp[Maxm];
int prec[Maxm];
int rez[Maxm];
 int dr=0;
int main() {
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>v[i];
    for(int i=1; i<=n; i++)
        {
        int st=1,dr2=dr;
        if(dr==0)
        {
            dp[1]=i;
            dr++;
        }
        else
        {

            while(st<dr2)
            {
                int mij=(st+dr2)/2;
                if(v[dp[mij]]>=v[i])
                {
                    dr2=mij-1;
                }
                else
                    st=mij+1;
            }
            if(v[dp[st]]<v[i])
            {
                if(dp[st+1]==0)
                {
                    dp[st+1]=i;
                    dr++;
                    prec[i]=dp[st];
                }
                else if(v[dp[st+1]]>v[i])
                {
                    dp[st+1]=i;
                    prec[i]=dp[st];
                }
            }
            else if(v[dp[st]]>v[i])
            {
                dp[st]=i;
            }
        }
    }
   // for(int i=1;i<=n;i++)
      //  cout<<dp[i]<<" ";
   int maxm=0,maxpoz=0;
   for(int i=1;i<=n;i++)
   {
       if(dp[i]!=0)
       {
           maxpoz=dp[i];
        maxm=i;
       }
   }
   int y=0;
   while(prec[maxpoz]!=0)
   {
       rez[y]=v[maxpoz];
       y++;
       maxpoz=prec[maxpoz];
   }
   rez[y]=v[maxpoz];
       y++;
   cout<<maxm<<endl;
   for(int i=y-1;i>=0;i--)
    cout<<rez[i]<<" ";
    return 0;
}