Cod sursa(job #1750512)

Utilizator george_stelianChichirim George george_stelian Data 30 august 2016 13:20:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int v[100010],q[100010],sol[100010],d[100010],tata[100010],nr;

int cauta_binar(int s)
{
    int st=1,dr=nr;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        if(s<=v[q[mid]]) dr=mid-1;
        else st=mid+1;
    }
    return st;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&v[i]);
    for(int i=1;i<=n;i++)
    {
        int poz=cauta_binar(v[i]);
        if(poz>nr) nr++;
        q[poz]=i;
        d[i]=d[q[poz-1]]+1;
        tata[i]=q[poz-1];
    }
    int maxx=0,poz=0,nr=0;
    for(int i=1;i<=n;i++)
        if(d[i]>maxx) {maxx=d[i];poz=i;}
    for(int i=poz;i>0;i=tata[i]) sol[++nr]=v[i];
    printf("%d\n",nr);
    for(int i=nr;i;i--) printf("%d ",sol[i]);
    return 0;
}