Cod sursa(job #1089200)

Utilizator pintilie.andreiPintilie pintilie.andrei Data 21 ianuarie 2014 16:16:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define NMAX 100005

using namespace std;

int a[NMAX],best[NMAX],poz[NMAX];
int n,x;

int cautare_binara(int,int,int);

int main()
{
    int i;
    FILE * fin=fopen("scmax.in","r");
    FILE * fout=fopen("scmax.out","w");

    fscanf(fin,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(fin,"%d",&a[i]);
    poz[1]=1;
    best[1]=a[1];
    best[0]=1;//contor cati am.
    for(i=2;i<=n;i++)
    {
        poz[i]=cautare_binara(1,best[0],a[i]);
    }
    fprintf(fout,"%d\n",best[0]);
    int z=0,s[NMAX];
    for(i=n;i>=1;i--)
        if(poz[i]==best[0])
        {
            z++;
            s[z]=a[i];
            best[0]--;
        }
    for(i=z;i>=1;i--)
        fprintf(fout,"%d ",s[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}


int cautare_binara(int st,int dr,int val)
{
    int mij;
    if(val>best[best[0]])
    {
        best[0]++;
        best[best[0]]=val;
        return best[0];
    }
    while(st<dr)
    {
        mij=(st+dr)/2;
        if(val<=best[mij]) dr=mij;
        else st=mij+1;
    }
    best[dr]=val;
    return dr;
}