Cod sursa(job #2478382)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 21 octombrie 2019 23:05:49
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,a[100100],best[100100],p[100100],lp[100100],Max,last,k,poz;
void afisare(int last)
{
    if(last>0) {
     afisare(p[last]);
     out<<a[last]<<" ";
    }
}
int cauta(int x)
{
    int ans=0;
    int l=0,r=k,m;
    while(l<=r)
    {
        m=(l+r)/2;
        if(a[lp[m]]<x)
        {
            ans=max(ans,m);
            l=m+1;
        }
        else r=m-1;
    }
    return ans;
}
int main()
{
    in>>n;
    for(int i=1;i<=n;i++) in>>a[i];
    best[1]=1;
    lp[1]=1;
    lp[0]=0;
    k=1;
    for(int i=2;i<=n;i++)
    {
        poz=cauta(a[i]);
        p[i]=lp[poz];
        best[i]=poz+1;
        lp[poz+1]=i;
        if(k<poz+1) k=poz+1;
    }
    for(int i=1;i<=n;i++)
       if(best[i]>Max)
       {
           Max=best[i];
           last=i;
       }
    out<<Max<<'\n';
    afisare(last);
    return 0;
}