Cod sursa(job #3351033)

Utilizator cezarinfoTulceanu Cezar cezarinfo Data 15 aprilie 2026 19:18:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX=100007;
int n;
int dp[NMAX];//dp[i]=val minima pe care o putem obtine pt lung i
int ind[NMAX];
int v[NMAX];
int maxxind;
int rev[NMAX];
int bs(int val)// cea mai din dreapta val strict mai mica
{
    int st=0;
    int dr=maxxind;
    int ras;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(dp[mij]<val)
        {
            ras=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    return ras;
}
int main()
{
    int fini=-1;
    in>>n;
    maxxind=0;
    for(int i=1;i<=n;i++)
    {
        in>>v[i];
        int poz=bs(v[i]);
        dp[poz+1]=v[i];
        ind[poz+1]=i;
        rev[i]=ind[poz];
        if(maxxind<poz+1)
        {
            maxxind=poz+1;
            fini=i;
        }
    }
    out<<maxxind<<"\n";
    int varpoz=fini;
    vector<int> ras;
    while(varpoz!=0)
    {
        ras.push_back(v[varpoz]);
        varpoz=rev[varpoz];
    }
    reverse(ras.begin(),ras.end());
    for(auto w:ras)
    {
        out<<w<<" ";
    }
}