Cod sursa(job #1658900)

Utilizator penetavyPene Cosmin-Octavian penetavy Data 21 martie 2016 21:10:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>

#define N_MAX 100000

FILE *fin = fopen("scmax.in", "r");
FILE *fout = fopen("scmax.out", "w");

int N;
int v[N_MAX + 1], q[N_MAX + 1], p[N_MAX + 1], L[N_MAX + 1];

int main(){
    int i, j, len_max = 1, st, dr, mij, pos;
    fscanf(fin, "%d", &N);
    fscanf(fin, "%d", &v[1]);
    q[1] = v[1];
    p[1] = 1;
    for(i = 2; i <= N; i++){
        fscanf(fin, "%d", &v[i]);
        st = 1;
        dr = len_max;
        pos = -1;
        while(st <= dr){
            mij = (st + dr) / 2;
            if(q[mij] < v[i]){
                st = mij + 1;
                pos = mij;
            }
            else if(q[mij] > v[i]){
                dr = mij - 1;
            }
            else if(q[mij] == v[i]){
                st = dr + 1;
                pos = mij - 1;
            }
        }
        if(pos == -1){
            q[1] = v[i];
            p[i] = 1;
        }
        else{
        q[pos + 1] = v[i];
        p[i] = pos + 1;
        if(pos == len_max)
            len_max++;
        }
    }

    int c = len_max;
    for(i = N; i >= 1 && c > 0; i--)
        if(p[i] == c)
            L[c--] = v[i];

    fprintf(fout, "%d\n", len_max);
    for(i = 1; i <= len_max; i++)
        fprintf(fout, "%d ", L[i]);

    fprintf(fout, "\n");
    fclose(fin);
    fclose(fout);
    return 0;
}