Cod sursa(job #2526413)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 18 ianuarie 2020 16:24:16
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>

using namespace std;
FILE *f,*g;
int l[100010],x[100010],sol[100010],nr,added;
int BinarySearch(int value,int i)
{
    int right=x[0],left=1,middle,P=-1;
    added=false;
    while(left<=right)
    {
        middle=(left+right)/2;
        if(x[middle]<value)
            P=middle,left=middle+1;
        else right=middle-1;
    }
    if(P==-1)x[1]=value,sol[1]=value;
    else x[P+1]=value;
    if(P+1>x[0])++x[0],added=true;
    return P;
}
void Displaying()
{
    int i;
    for(i=1;i<=nr;++i)fprintf(g,"%d ",sol[i]);
}
int main()
{
    f=fopen("scmax.in","r");g=fopen("scmax.out","w");
    int X,i,n,P,max=1;
    fscanf(f,"%d",&n);
    fscanf(f,"%d",&X);
    x[++x[0]]=X;l[1]=1;sol[++nr]=X;
    for(i=2;i<=n;++i)
    {
        fscanf(f,"%d",&X);
        P=BinarySearch(X,i);
        if(P+1==x[0])
        {
            l[P+1]=l[P]+1;
            if(added==true)++nr,sol[nr]=X;
            else sol[nr]=X;

        }
        if(l[P+1]>max)max=l[P+1];
    }
    fprintf(g,"%d\n",max);
    Displaying();
    fclose(f);fclose(g);
    return 0;
}