Cod sursa(job #2523618)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 14 ianuarie 2020 15:00:45
Problema Subsir crescator maximal Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>

using namespace std;
FILE *f,*g;
int l[100010],x[100010],pred[100010],poz[100010],v[100010];
int BinarySearch(int value,int i)
{
    int right=x[0],left=1,middle,P=-1;
    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,poz[1]=i;
    else x[P+1]=value,pred[i]=pred[poz[P]],poz[P+1]=i;
    if(P+1>x[0])++x[0];
    return P;
}
void Displaying(int pm)
{
    if(pred[pm])
    {
        Displaying(pred[pm]);
        fprintf(g,"%d ",v[pm]);
    }
}
int main()
{
    f=fopen("scmax.in","r");g=fopen("scmax.out","w");
    int X,i,n,P,max=1,pm;
    fscanf(f,"%d",&n);
    fscanf(f,"%d",&X);
    x[++x[0]]=X;l[1]=1;
    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(l[P+1]>max)max=l[P+1],pm=i;
    }
    fprintf(g,"%d\n",max);
    Displaying(pm);
    fclose(f);fclose(g);
    return 0;
}