Cod sursa(job #1149718)

Utilizator mircea98roMircea Popovici mircea98ro Data 22 martie 2014 10:48:59
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>

using namespace std;

FILE * f=freopen("scmax.in","r",stdin);
FILE * g=freopen("scmax.out","w",stdout);

int a[100001],poz[100001],cmax,i,n,ca,cb;
int x[100001];

int best(int st,int dr)
{
    if (st>dr)
        return 1;
    if (st==dr && x[poz[st]]>x[i])
        return st+1;
    if (st==dr && x[poz[st]]==x[i])
        return 0;
    int pivot=(st+dr)/2;
    if (x[poz[pivot]]<=x[i])
        return best(st,pivot);
    return best(pivot+1,dr);
}
int main()
{
    scanf("%d",&n);
    //f>>n;
    for (i=1;i<=n;i++)
        scanf("%d",&x[i]);
        //f>>x[i];
    for(i=n;i>0;i--)
    {
        ca=x[i];
        int aux;
        if (x[i]>x[poz[1]])
            aux=1;
        else    aux=best(1,cmax);
        poz[aux]=i;
        a[i]=poz[aux-1];
        cmax=aux>cmax?aux:cmax;
    }
    cb=poz[cmax];
    printf("%d\n",cmax);
    //g<<cmax<<'\n';
    while (cb)
    {
        printf("%d ",x[cb]);
        //g<<x[cb]<<' ';
        cb=a[cb];
    }
    printf("\n");
    //g<<'\n';
    fclose(f);
    fclose(g);
    return 0;
}