Cod sursa(job #1190701)

Utilizator hrazvanHarsan Razvan hrazvan Data 25 mai 2014 16:37:42
Problema Subsir crescator maximal Scor 95
Compilator c Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#define N_MAX 100000

int v[ N_MAX ], m[ N_MAX + 1 ], p[ N_MAX ], rez[ N_MAX ], ind = 0;

int caut ( int i, int maxl ){
    int poz = 0, pas = 1 << 16;
    while ( pas > 0 ){
        if ( poz + pas <= maxl ){
            if ( v[ m[ poz + pas ] ] < v[ i ] ){
                poz += pas;
            }
        }
        pas >>= 1;
    }
    return poz + 1;
}

int main()
{
    FILE *in = fopen ( "scmax.in", "r" );
    int n;
    fscanf ( in, "%d", &n );
    int i, maxl = 0, l;
    for ( i = 0; i < n; i++ ){
        fscanf ( in, "%d", &v[ i ] );
        l = caut ( i, maxl );
        if ( l > maxl ){
            m[ l ] = i;
            p[ i ] = m[ l - 1 ];
            maxl = l;
        }
        else  if ( v[ i ] < v[ m [ l ] ] ){
            m [ l ] = i;
            p [ i ] = m[ l - 1 ];
        }
    }
    fclose ( in );
    FILE *out = fopen ( "scmax.out", "w" );
    fprintf ( out, "%d\n", maxl );
    int poz = m[ maxl ];
    while ( poz > 0 ){
        rez[ ind ] = v[ poz ];
        ind++;
        poz = p[ poz ];
    }
    for ( i = ind - 1; i >= 0; i-- ){
        fprintf ( out, "%d ", rez[ i ] );
    }
    fclose ( out );
    return 0;
}