Cod sursa(job #1094555)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 29 ianuarie 2014 16:09:55
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#define DIM 100004
FILE *f=fopen("scmax.in","r"), *g=fopen("scmax.out","w");

long int n, v[DIM], Q[DIM], P[DIM], lQ=0, sol[DIM];

void citire(){
long int i;

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

}

long int inserare(long int nr){
long int st, fn, mij;

    st=1; fn=lQ; mij= (st+fn)/2;
    while(st<=fn){

        if( Q[mij-1] < nr && nr <= Q[mij] )  { return mij; }
        else if( nr< Q[mij] ) { fn=mij-1; mij=(st+fn)/2; }
        else                  { st=mij+1; mij=(st+fn)/2; }

    }

    lQ++; return lQ; // numarul e mai mare decat toate || Q e vid

}

void rezolvare(){
long int i,j, cauta;

    for(i=1;i<=n;i++){
        P[i]=inserare(v[i]);
        Q[ P[i] ]=v[i];
    }
    fprintf(g,"%ld\n",lQ);
    cauta=lQ;
    for(i=n;i>=1;i--){
        if(P[i]==cauta){sol[cauta]=v[i];cauta--;}
    }
    for(i=1;i<=lQ;i++)fprintf(g,"%ld ",sol[i]);

}

int main(){

    citire();
    rezolvare();

return 0;
}