Cod sursa(job #1623047)

Utilizator IgorDodonIgor Dodon IgorDodon Data 1 martie 2016 16:47:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
#define DIM 100005
FILE *f=fopen("scmax.in","r"), *g=fopen("scmax.out","w");

int N, v[DIM], P[DIM], Q[DIM], hQ, r[DIM];

void Citire(){
int i;

    fscanf(f,"%d\n",&N);
    for(i=1;i<=N;i++)
        fscanf(f,"%d",&v[i]);
}

void Pune( int NR, int POZ, int I ){

    Q[POZ] = NR;
    P[I] = POZ;

}

void PD(){
int i, nr, st, dr, mij, next;

    hQ = 1;
    Q[1] = v[1];
    P[1] = 1;

    for(i=2;i<=N;i++){

        nr = v[i];
        if( nr > Q[hQ] )
            Pune(nr,++hQ,i);

        else{

            st = 1;
            dr = hQ;

            while( st <= dr ){

                mij = (st+dr)/2;

                if( Q[mij-1] < nr && nr <= Q[mij] )
                    { Pune(nr,mij,i); break; }
                else if( nr <= Q[mij-1] )
                    dr = mij-1;
                else
                    st = mij+1;

            }

        }

    }

    fprintf(g,"%d\n",hQ);

    next = hQ;
    for(i=N;i>=1,next!=0;i--){

        if( P[i] == next ){
            r[next] = v[i];
            next--;
        }

    }

    for(i=1;i<=hQ;i++)
        fprintf(g,"%d ",r[i]);

}

int main(){

    Citire();
    PD();

return 0;
}