Cod sursa(job #2531798)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 26 ianuarie 2020 18:55:19
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
#define NMAX 100010
using namespace std;
FILE *f,*g;
int poz[NMAX],pred[NMAX],v[NMAX],l[NMAX],N,nr;
int BinarySearch(int value,int i)
{
    int P=-1,middle,left=1,right=nr;
    while(left<=right)
    {
        middle=(left+right)/2;
        if(v[poz[middle]]<value)P=middle,left=middle+1;
        else right=middle-1;
    }
    if(P==-1)poz[1]=i;
    else poz[P+1]=i,pred[i]=poz[P];
    if(P+1>nr)++nr;
    return P;
}
void Displaying(int pm)
{
    if(pm)
    {
        Displaying(pred[pm]);
        fprintf(g,"%d ",v[pm]);
    }
}
int main()
{
    f=fopen("scmax.in","r");g=fopen("scmax.out","w");
    int i,j,P,Max=0,pm;
    fscanf(f,"%d%d",&N,&v[1]);
    l[1]=1,poz[++nr]=1;
    for(i=2;i<=N;++i)
    {
        fscanf(f,"%d",&v[i]);
        P=BinarySearch(v[i],i);
        if(P+1==nr)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;
}