Cod sursa(job #945040)

Utilizator MaddoxMihalcea-Simoiu Theodor Maddox Data 30 aprilie 2013 11:54:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>

using namespace std;
long a[200000],aux[200000],b[200000],c=1,n;
int i,poz,maxm=0,imax;
int cautare(int x)
{
    int p=1,q=c,m;
    if(a[b[q]]<x) return q+1;
    while(p<q)
    {
        m=(p+q)>>1;
        if(a[b[m]]>=x) q=m;
        else p=m+1;
    }
    return p;
}
void write (int x)
{
    if(aux[x]>0)
        write (aux[x]);
    printf("%d ",a[x]);
}
int main()
{
   freopen("scmax.in","r",stdin);
   freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        scanf("%d",&a[i]);
    b[1]=1;
    for(i=2; i<=n; i++)
    {
        poz=cautare(a[i]);
        aux[i]=b[poz-1];
        b[poz]=i;
        if(poz>c) c++;
        if(poz>maxm)
        {
            maxm=poz;
            imax=i;
        }
    }
    printf("%d\n",maxm);
    write(imax);
    fclose(stdin);
    fclose(stdout);
    return 0;
}