Cod sursa(job #1510501)

Utilizator NacuCristianCristian Nacu NacuCristian Data 25 octombrie 2015 09:37:37
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int indice_capat_subsir[100010],predecesor[100010],n,l,x[100010],pozmax;

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

int cautare_binara(int q, int i)
{
    int st=1;
    int fi=l;
    while(st<=fi)
    {
        int mij=(st+fi)/2;
        if(x[indice_capat_subsir[mij]]<x[i])
            st=mij+1;
        else if(x[indice_capat_subsir[mij]]>=x[i])
            fi=mij-1;
    }
    return st;
}

void afisare(int k)
{
    if(k>0)
    {
        afisare(predecesor[k]);
        printf("%d ",x[k]);
        return;
    }
    return;
}

int main()
{
    freopen("scmax.out","w",stdout)
    citire();
    for(int i=1;i<=n;i++)
    {
        int k=cautare_binara(x[i],i);
        predecesor[i]=indice_capat_subsir[k-1];
        indice_capat_subsir[k]=i;
        if(k>l)
        {
            l=k;
            pozmax=i;
        }
    }
    printf("%d\n",l);
    afisare(pozmax);

    return 0;
}