Cod sursa(job #1731128)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 18 iulie 2016 13:12:31
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#define lim 100005
int v[lim],poz[lim],next[lim];
int caut(int st,int dr,int val){
    int mij,rasp=dr+1;
    while(st<=dr){
        mij=(st+dr)/2;
        if(v[poz[mij]]>val){
            //rasp=mij;
            st=mij+1;
        }
        else{
            rasp=mij;
            dr=mij-1;
        }
    }
    return rasp;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");
    int i,j,n,m=0;
    fscanf(fin,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(fin,"%d",&v[i]);
    v[0]=2000000000;
    for(i=n;i>=1;i--){
        j=caut(0,m,v[i]);
        if(j>m){
            next[i]=poz[j-1];
            m=j;
            poz[j]=i;
        }
        else{
            if(v[poz[j]]<v[i]){
                next[poz[j-1]]=i;
                poz[j]=i;
            }
        }
    }
    fprintf(fout,"%d\n",m);
    for(i=poz[m];i>0;i=next[i])
        fprintf(fout,"%d ",v[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}