Cod sursa(job #1327345)

Utilizator doruliqueDoru MODRISAN dorulique Data 26 ianuarie 2015 17:19:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
using namespace std;

int a[100001],t[100001],
    cb[100001],ind[100001],n;

int main()
{
    FILE *f=fopen("scmax.in","r");
    fscanf(f,"%d",&n);
    int i,lmax=1,s,d,m;
    for(i=1;i<=n;i++)
        fscanf(f,"%d",&a[i]);
    t[1]=0;
    cb[1]=a[1];ind[1]=1;
    for(i=2;i<=n;i++)
    {//kutam binar a[i] in cb intre indicii 1 shi lmax
        s=1;d=lmax;m=(s+d)/2;
        while(s<=d && cb[m]!=a[i])
        {
            if(a[i]<cb[m])
                        d=m-1;
                    else
                        s=m+1;
            m=(s+d)/2;
        }
        if(s>d)
            if(s>lmax)
                {
                    cb[++lmax]=a[i];
                    ind[lmax]=i;
                    t[i]=ind[lmax-1];
                }
            else
                {
                    cb[s]=a[i];
                    ind[s]=i;
                    t[i]=ind[d];
                }
        else
            t[i]=ind[m-1];
    }
    f=fopen("scmax.out","w");
    fprintf(f,"%d\n",lmax);
    i=ind[lmax];
    s=lmax;
    while(i)
    {
        ind[s--]=a[i];
        i=t[i];
    }
    for(i=1;i<=lmax;i++)
        fprintf(f,"%d ",ind[i]);
    return 0;
}