Cod sursa(job #2865579)

Utilizator PescaPescariu Matei Alexandru Pesca Data 8 martie 2022 22:27:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int const N=(int)1e5+5;
int n,v[N],urm[N],mx[N],dim;
int caut(int x,int st=1,int dr=dim)
{
    /// mx va avea toate elementele diferite si va fi desc
    /// caut cel mai din dr element care este > x
    if(dr<st)
        return st;
    int m=(st+dr)/2;
    if(v[mx[m]]<=x)
        return caut(x,st,m-1);
    return caut(x,m+1,dr);
}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    mx[1]=n;
    dim=1; /// de la 1 la 1 momentan
    for(int i=n-1;i;i--)
    {
        int x=caut(v[i]); /// trb pus pe x
        if(x>dim)
            dim++;
        if(v[i]>v[mx[x]])
            mx[x]=i;
        urm[i]=mx[x-1];
    }
    fout<<dim<<'\n';
    for(int x=mx[dim];x;fout<<v[x]<<' ',x=urm[x]);
}