Cod sursa(job #978261)

Utilizator raulmuresanRaul Muresan raulmuresan Data 28 iulie 2013 15:17:01
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
// subsir crescator maximal cu cautare binara


#include <cstdio>

using namespace std;
int i, j, n, lung[100005],cont,maxi,sf,val[100005],sol;
int v[100005];

int minim(int a,int b)
{
    if(a<b) return a;
    return b;
}

void afisare()
{
    int t;
    for(t=1;t<=sf;t++)
    {
        printf("%d ",val[t]);
    }
    printf("\n");
}

int binary(int st,int dr,int x)
{
    int mij;

    while(st<=dr+1)
    {
        mij=(st+dr)/2;

        // if(i==8) printf("%d\n",mij);
        if(mij==dr || (val[mij]>=x && val[mij-1]<x))
        {

           // if(i==8) //printf("%d %d\n",val[mij],val[mij-1]);
           // printf("ok");
            //printf("%d %d\n",mij,val [mij]);
            //afisare();
            val[mij]=minim(val[mij],x);

            return mij;
        }
        else
        {
            if(val[mij]>x)
            {
                dr=mij-1;
            }
            else
            st=mij+1;
        }
        //if(i==8) //printf("%d %d\n",st,dr);
        //printf("%d\n",mij);
    }
}





int main() {

    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);

    for(i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        //printf("%d %d\n",i,v[i]);
        if(v[i]>val[sf])
        {
            sf++;
            val[sf]=v[i];
            lung[i]=sf;
        }
        else
        {
            lung[i]=binary(1,sf,v[i]);
            //if(i==8) printf("ok");
        }
       // afisare();
    if(lung[i]>sol) sol=lung[i];
    }
   // printf("%d\n",minim(8,9));
    printf("%d\n",sf);
}