Cod sursa(job #2081038)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 3 decembrie 2017 20:31:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#define MAXN 100000
void cautbin(int i,int& lmax);
FILE*fin,*fout;
int v[MAXN+1];
int M[MAXN+1];
int P[MAXN+1];
int main()
{
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");
    int N;
    fscanf(fin,"%d",&N);
    int Lmax=0;
    for(int i=1;i<=N;i++)
    {
        fscanf(fin,"%d",&v[i]);
        cautbin(i,Lmax);
    }
    int afis[MAXN+1],ult=0;
    for(int i=M[Lmax];i!=0;i=P[i])
    {
        afis[++ult]=i;
    }
    fprintf(fout,"%d\n",Lmax);
    for(int i=ult;i>=1;i--)
    {
        fprintf(fout,"%d ",v[afis[i]]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}
void cautbin(int i,int& lmax)
{
    int st=1,dr=lmax;
    while(st<=dr)
    {
        int mij=(st+dr)>>1;
        if(v[M[mij]]<v[i])
        {
            //putem anexa la lungimea mij,cautam mai sus
            st=mij+1;
        }
        else
        {
            //nu putem anexa la lungimea mij,cautam mai jos
            dr=mij-1;
        }
    }
    int newL=st;
    if(newL>lmax)
    {
        lmax=newL;
        M[newL]=i;
        P[M[newL]]=M[newL-1];
    }
    else
    {
        if(v[i]<v[M[newL]])
        {
            M[newL]=i;
            P[M[newL]]=M[newL-1];
        }
    }
}