Cod sursa(job #1770914)

Utilizator danielNiculaeDaniel Niculae danielNiculae Data 4 octombrie 2016 23:39:29
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/* 
 * File:   main.cpp
 * Author: octavian
 *
 * Created on 04 October 2016, 18:10
 */

#include <cstdlib>
#include <cstdio>

using namespace std;

const int NMAX = 100005;
const int INF = 2000000005;

int a[NMAX];
int X[NMAX];
int pred[NMAX];//remembers predecessors for a position, because values are not unique
int res[NMAX];
int longest = 0;

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


int bSearchLarger(int start, int end, int x) {
    int pos = 0;
    int pow = 1;
    while((pow << 1) <= end) {
        pow <<= 1;
    }
//    fprintf(fout, "pos is %d\n", pow);
    while(pow > 0) {
        if(x > a[X[pos + pow]] && pos + pow <= end) {
            pos += pow;
        }
        pow >>= 1;
    }
    return pos;
}

/*
 * 
 */
int main(int argc, char** argv) {
    
    int N;
    fscanf(fin, "%d", &N);
    
    for(int i = 1 ; i <= N ; i++) {
        fscanf(fin, "%d", &a[i]);
    }
    a[0] = INF;
    
    for(int i = 1 ; i <= N ; i++) {

        int longestString = bSearchLarger(1, longest, a[i]);
//        fprintf(fout, "longestString: %d\n", longestString);
        if(a[i] < a[X[longestString + 1]]) {
            X[longestString + 1] = i;
//            fprintf(fout, "X[longestString + 1]: %d, %d\n", X[longestString + 1], a[X[longestString + 1]]);
            pred[X[longestString + 1]] = X[longestString];           
//            fprintf(fout, "pred of %d is %d\n", X[longestString + 1], X[longestString]);
            if(longestString + 1 > longest) {
                longest = longestString + 1;
            }
        }

    }    
    
    fprintf(fout, "%d\n", longest);    
    
    int pos = X[longest];
    for(int i = longest ; i ; i--) {
        res[i] = a[pos];
        pos = pred[pos];
    }
    
    for(int i = 1 ; i <= longest ; i++) {
        fprintf(fout, "%d ", res[i]);
    }

    fclose(fin);
    fclose(fout);
    
    return 0;
}