Cod sursa(job #1234302)

Utilizator george_stelianChichirim George george_stelian Data 27 septembrie 2014 01:46:55
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>

using namespace std;

int v[100010],sol[100010],t[100010],n,i,nr,poz;

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

void write(int x)
{
    if(t[x]) write(t[x]);
    printf("%d ",v[x]);
}

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