Cod sursa(job #1644360)

Utilizator NacuCristianCristian Nacu NacuCristian Data 9 martie 2016 22:42:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int x[100010],scmax[100010],predecesor[100010];
int n,l=1;


void citire()
{
    freopen("scmax.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&x[i]);
    scmax[1]=1;
}

void afis_rec(int ind)
{
    if(ind)
    {
        afis_rec(predecesor[ind]);
        printf("%d ", x[ind]);
    }
}

void afisare()
{
    freopen("scmax.out","w",stdout);
    printf("%d\n",l);
    int ind=scmax[l];
    afis_rec(ind);
}

int cautare_binara(int a)
{
    int st=1,dr=l;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(a>x[scmax[mij]])
            st=mij+1;
        else
            dr=mij-1;
    }
    return st;
}


void dinamica()
{
    for(int i=2;i<=n;i++)
    {
        int poz=cautare_binara(x[i]);
        if(scmax[poz]<=x[i])
        {
            predecesor[i]=scmax[poz-1];
            scmax[poz]=i;
            if(poz>l)
                l=poz;
        }
    }
}

int main()
{
    citire();
    dinamica();
    afisare();
    return 0;
}